3 Stimmen

Iterativ XML-Knoten in Python schreiben

Es gibt viele Möglichkeiten, XML zu lesen, entweder alles auf einmal (DOM) oder Bit für Bit (SAX). Ich habe SAX oder lxml verwendet, um große XML-Dateien (z.B. Wikipedia-Dump, das 6,5 GB komprimiert ist) iterativ zu lesen.

Nachdem ich jedoch einige iterative Verarbeitungen (in Python mit ElementTree) dieser XML-Datei durchgeführt habe, möchte ich die (neuen) XML-Daten in eine andere Datei schreiben.

Gibt es Bibliotheken, um XML-Daten iterativ zu schreiben? Ich könnte den XML-Baum erstellen und dann schreiben, aber das ist ohne viel RAM nicht möglich. Gibt es eine Möglichkeit, den XML-Baum iterativ in eine Datei zu schreiben? Bit für Bit?

Ich weiß, dass ich das XML selbst mit print "<%s>" % tag_name generieren könnte, aber das erscheint mir ein wenig... hacky.

4voto

samplebias Punkte 35688

Frederik Lundhs elementtree.SimpleXMLWriter ermöglicht es Ihnen, XML inkrementell zu schreiben. Hier ist der Democode, der im Modul eingebettet ist:

from elementtree.SimpleXMLWriter import XMLWriter
import sys

w = XMLWriter(sys.stdout)

html = w.start("html")

w.start("head")
w.element("title", "mein Dokument")
w.element("meta", name="generator", value="meine Anwendung 1.0")
w.end()

w.start("body")
w.element("h1", "dies ist eine Überschrift")
w.element("p", "dies ist ein Absatz")

w.start("p")
w.data("das ist ")
w.element("b", "fett")
w.data(" und ")
w.element("i", "kursiv")
w.data(".")
w.end("p")

w.close(html)

1voto

unutbu Punkte 769083

Mit lxml können Sie etree.Element verwenden, um neue Knoten zu erstellen, und etree.tostring, um die XML-Repräsentation auszugeben. Siehe beispielsweise Listing 6. Serialize an element's children aus Liza Dalys Artikel "High-performance XML parsing in Python mit lxml".

1voto

xtofl Punkte 39285

Wenn Sie in XML-Dialekt1 lesen und XML-Dialekt2 schreiben müssen, wäre es nicht eine gute Idee, den Konvertierungsprozess mit XSLT aufzuschreiben? Auf diese Weise benötigen Sie möglicherweise nicht einmal eigenen Quellcode.

1voto

jsbueno Punkte 84804

Wenn Sie nichts Anderes finden, was ich hier bevorzugen würde, ist von ElementTree abzuleiten und einen "iteractiveElementTree" zu erstellen, der ein "file" -Attribut hinzufügt. Ich würde die Knoten unterklasse haben, um ein "start_tag_comitted" -Attribut und eine "commit" -Methode zu haben. Beim Aufruf würde diese "commit" Methode die render Methode für einen Teilbaum aufrufen - beginnend beim entferntesten Elternteil, wo "start_tag_comitted" falsch ist. Mit dem string in der Hand würde ich manuell die schließenden Tags für die Eltern des aktuellen Knotens entfernen. Es besteht auch die Notwendigkeit, mit den zuvor geöffneten, aber nicht geschlossenen Elterngeschwistern umzugehen.

Dann würde ich den "commited" Knoten aus dem Speichermodell entfernen. Sie müssen auch die Elternknoten jedes Knotens kennzeichnen, da ElementTree das nicht tut.

(Schreiben Sie mir, wenn es keine besseren Antworten gibt und Sie dort stecken bleiben, könnte ich das implementieren)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X