سؤال

أريد إضافة DocTypes إلى مستندات XML الخاصة بي التي تولدها مع EXML's Etree.

ومع ذلك، لا يمكنني معرفة كيفية إضافة doctype. الصغار والتنازل عن السلسلة ليست خيارا.

كنت أتوقع شيئا على غرار كيفية إضافة PI في ETREE:

pi = etree.PI(...)
doc.addprevious(pi)

لكنها لا تعمل من أجلي. كيفية إضافة مستند XML مع LXML؟

هل كانت مفيدة؟

المحلول

يمكنك إنشاء المستند الخاص بك مع DocType لتبدأ ب:

# Adapted from example on http://codespeak.net/lxml/tutorial.html
import lxml.etree as et
import StringIO
s = """<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root SYSTEM "test" [ <!ENTITY tasty "cheese"> 
<!ENTITY eacute "&#233;"> ]>
<root>
<a>&tasty; souffl&eacute;</a>
</root>
"""
tree = et.parse(StringIO.StringIO(s))
print et.tostring(tree, xml_declaration=True, encoding="utf-8")

مطبوعات:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE root SYSTEM "test" [
<!ENTITY tasty "cheese">
<!ENTITY eacute "&#233;">
]>
<root>
<a>cheese soufflé</a>
</root>

إذا كنت ترغب في إضافة doctype إلى بعض XML لم يتم إنشاؤها مع واحد، فيمكنك أولا إنشاء واحد مع DocType المطلوب (على النحو الوارد أعلاه)، ثم انسخ XML DocTyPe الخاص بك في ذلك:

xml = et.XML("<root><test/><a>whatever</a><end_test/></root>")
root = tree.getroot()
root[:] = xml
root.text, root.tail = xml.text, xml.tail
print et.tostring(tree, xml_declaration=True, encoding="utf-8")

مطبوعات:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE root SYSTEM "test" [
<!ENTITY tasty "cheese">
<!ENTITY eacute "&#233;">
]>
<root><test/><a>whatever</a><end_test/></root>

هل هذا ما تبحث عنه؟

نصائح أخرى

هذا عملت بالنسبة لي:

print etree.tostring(tree, pretty_print=True, xml_declaration=True, encoding="UTF-8", doctype="<!DOCTYPE TEST_FILE>")

تمت إضافة PI بالفعل كعنصر سابق من "DOC". وبالتالي، ليس طفلا من "الوثيقة". يجب عليك استخدام "Doc.Getroottree ()"

هنا مثال:

>>> root = etree.Element("root")
>>> a  = etree.SubElement(root, "a")
>>> b = etree.SubElement(root, "b")
>>> root.addprevious(etree.PI('xml-stylesheet', 'type="text/xsl" href="my.xsl"'))
>>> print etree.tostring(root, pretty_print=True, xml_declaration=True, encoding='utf-8')
<?xml version='1.0' encoding='utf-8'?>
<root>
  <a/>
  <b/>
</root>

مع getroottree ():

>>> print etree.tostring(root.getroottree(), pretty_print=True, xml_declaration=True, encoding='utf-8')
<?xml version='1.0' encoding='utf-8'?>
<?xml-stylesheet type="text/xsl" href="my.xsl"?>
<root>
  <a/>
  <b/>
</root>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top