Heutzutage ist die beliebteste (und sehr einfache) Option die ElementTree-API , die seit Python 2.5 in der Standardbibliothek enthalten ist.
Die verfügbaren Optionen dafür sind:
- ElementTree (Grundlegende, reine Python-Implementierung von ElementTree. Teil der Standardbibliothek seit 2.5)
- cElementTree (Optimierte C-Implementierung von ElementTree. Wird seit 2.5 auch in der Standardbibliothek angeboten.)
- LXML (Basierend auf libxml2. Bietet eine umfangreiche Obermenge der ElementTree-API sowie XPath, CSS-Selektoren und mehr.)
Hier ist ein Beispiel, wie Sie Ihr Beispieldokument mit dem in-stdlib cElementTree generieren:
import xml.etree.cElementTree as ET
root = ET.Element("root")
doc = ET.SubElement(root, "doc")
ET.SubElement(doc, "field1", name="blah").text = "some value1"
ET.SubElement(doc, "field2", name="asdfasd").text = "some vlaue2"
tree = ET.ElementTree(root)
tree.write("filename.xml")
Ich habe es getestet und es funktioniert, aber ich gehe davon aus, dass Leerzeichen nicht signifikant sind. Wenn Sie einen "Prettyprint" -Einzug benötigen, lassen Sie es mich wissen und ich werde nachschlagen, wie das geht. (Möglicherweise handelt es sich um eine LXML-spezifische Option. Ich verwende die stdlib-Implementierung nicht häufig.)
Zur weiteren Lektüre hier einige nützliche Links:
Abschließend sei angemerkt, dass entweder cElementTree oder LXML für alle Ihre Anforderungen schnell genug sein sollten (beide sind optimierter C-Code) Die LXML-Site gibt Folgendes an:
- LXML gewinnt eindeutig für die Serialisierung (Generierung) von XML
- Als Nebeneffekt bei der Implementierung einer ordnungsgemäßen übergeordneten Durchquerung ist LXML beim Parsen etwas langsamer als cElementTree.
xml_declaration=True
wenn Sie eine Codierung angeben. Um ein gleichwertiges Verhalten zu erzielen , rufen Sie Folgendes auftree.write()
:tree.write("filename.xml", xml_declaration=True, encoding='utf-8')
Sie können jede Codierung verwenden, solange Sie dies explizit angeben einer. (ascii
Erzwingt, dass alle Unicode-Zeichen außerhalb des 7-Bit-ASCII-Satzesvlaue2
zuvalue2
: Der Tippfehler in der gewünschten XML - Ausgabe in der ursprünglichen Frage. Bis sich das ändert, die Tippfehler hier tatsächlich ist richtig.cElementTree
wurde in Python 3.3 abgeschriebenDie lxml-Bibliothek enthält eine sehr praktische Syntax für die XML-Generierung, die E-Factory . So würde ich das Beispiel machen, das Sie geben:
Ausgabe:
Es unterstützt auch das Hinzufügen zu einem bereits erstellten Knoten, z. B. nach dem oben Gesagten
quelle
getattr
zgetattr(E, "some-tag")
.Yattag http://www.yattag.org/ oder https://github.com/leforestier/yattag bietet eine interessante API zum Erstellen eines solchen XML-Dokuments (und auch von HTML-Dokumenten).
Es verwendet Kontextmanager und
with
Schlüsselwort.So erhalten Sie:
quelle
Für die einfachste Wahl würde ich mich für minidom entscheiden: http://docs.python.org/library/xml.dom.minidom.html . Es ist in die Python-Standardbibliothek integriert und in einfachen Fällen unkompliziert zu verwenden.
Hier ist ein ziemlich einfach zu befolgendes Tutorial: http://www.boddie.org.uk/python/XML_intro.html
quelle
Für eine so einfache XML-Struktur möchten Sie möglicherweise kein vollständiges XML-Modul einbeziehen. Betrachten Sie eine Zeichenfolgenvorlage für die einfachsten Strukturen oder Jinja für etwas Komplexeres. Jinja kann eine Liste von Daten durchlaufen, um die innere XML Ihrer Dokumentliste zu erstellen. Bei rohen Python-String-Vorlagen ist das etwas schwieriger
Ein Jinja-Beispiel finden Sie in meiner Antwort auf eine ähnliche Frage .
Hier ist ein Beispiel für das Generieren Ihrer XML mit Zeichenfolgenvorlagen.
Ausgabe:
Der Wehrmutstropfen der Vorlage Ansatz ist , dass Sie nicht entkommen erhalten von
<
und>
kostenlos. Ich habe um dieses Problem herum getanzt, indem ich einen Util aus gezogen habexml.sax
quelle
Ich habe gerade einen XML-Generator mit der Template-Methode von bigh_29 fertig geschrieben. Dies ist eine gute Möglichkeit, die Ausgabe zu steuern, ohne dass zu viele Objekte im Weg stehen.
Für das Tag und den Wert habe ich zwei Arrays verwendet, eines, das den Tag-Namen und die Position in der Ausgabe-XML angibt, und eines, das auf eine Parameterdatei mit derselben Liste von Tags verweist. Die Parameterdatei hat jedoch auch die Positionsnummer in der entsprechenden Eingabedatei (CSV), aus der die Daten entnommen werden. Auf diese Weise ändert sich das Programm nicht, wenn sich die Position der aus der Eingabedatei eingehenden Daten ändert. Es berechnet dynamisch die Datenfeldposition aus dem entsprechenden Tag in der Parameterdatei.
quelle