Frage

Ich möchte doctypes meiner XML-Dokumente hinzufügen, die ich mit LXML der etree bin zu erzeugen.

Allerdings kann ich nicht herausfinden, wie ein Doctype hinzuzufügen. die Zeichenfolge zu und concating ist keine Option.

Ich hatte erwartet, etwas entlang der Linien, wie PI sind in etree hinzugefügt:

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

Aber es funktioniert nicht für mich. Wie ein mit lxml zu einem XML-Dokument hinzufügen?

War es hilfreich?

Lösung

Sie können Ihr Dokument mit einem Doctype erstellen zu beginnen:

# 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")

druckt:

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

Wenn Sie eine Doctype einige XML hinzufügen möchten, die nicht mit einer erstellt wurde, können Sie zunächst erstellen eine mit dem gewünschten Doctype (wie oben), dann kopieren Sie Ihre Doctype-less XML hinein:

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")

druckt:

<?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>

Ist das, was Sie suchen?

Andere Tipps

Das funktioniert für mich:

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

Das PI ist tatsächlich als ein Element, das aus früheren „doc“ hinzugefügt. Somit ist es nicht ein Kind von „doc“. Sie müssen "doc.getroottree ()"

verwenden

Hier ist ein Beispiel:

>>> 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>

mit 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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top