ElementTree iterparse Strategie
Habe ich, um die xml-Dokumente, die sind groß genug (bis zu 1GB) und analysieren Sie mit python. Ich bin mit dem iterparse() Funktion (SAX Stil parsing).
Mein Anliegen ist Folgendes, angenommen man hat ein xml, wie dies
<?xml version="1.0" encoding="UTF-8" ?>
<families>
<family>
<name>Simpson</name>
<members>
<name>Homer</name>
<name>Marge</name>
<name>Bart</name>
</members>
</family>
<family>
<name>Griffin</name>
<members>
<name>Peter</name>
<name>Brian</name>
<name>Meg</name>
</members>
</family>
</families>
Das problem ist natürlich, zu wissen, Wann, ich bin immer ein Familien-name (wie Simpsons) und wenn ich bin immer der name einer Familie Mitglied (zum Beispiel Homer)
Was habe ich getan, so weit ist die Verwendung von "switches" die sagen mir, wenn ich mich in ein "Mitglieder" - tag ist oder nicht, wird der code wie folgt Aussehen
import xml.etree.cElementTree as ET
__author__ = 'moriano'
file_path = "test.xml"
context = ET.iterparse(file_path, events=("start", "end"))
# turn it into an iterator
context = iter(context)
on_members_tag = False
for event, elem in context:
tag = elem.tag
value = elem.text
if value :
value = value.encode('utf-8').strip()
if event == 'start' :
if tag == "members" :
on_members_tag = True
elif tag == 'name' :
if on_members_tag :
print "The member of the family is %s" % value
else :
print "The family is %s " % value
if event == 'end' and tag =='members' :
on_members_tag = False
elem.clear()
Und dies funktioniert sehr gut, da der Ausgang
The family is Simpson
The member of the family is Homer
The member of the family is Marge
The member of the family is Bart
The family is Griffin
The member of the family is Peter
The member of the family is Brian
The member of the family is Meg
Meine Sorge ist, dass mit diesem (einfachen) Beispiel musste ich erstellen Sie eine zusätzliche variable, um zu wissen, in welches tag ich war (on_members_tag) vorstellen, mit der echten xml-Beispiele, die ich habe zu handhaben, Sie haben mehr verschachtelte tags.
Beachten Sie auch, dass dies ein sehr reduziertes Beispiel, so können Sie davon ausgehen, dass ich möglicherweise vor einem xml mit mehr tags, mehr innere tags und versuchen, zu verschiedenen tag-Namen, Attribute und so weiter.
Also Frage ist. Mache ich etwas furchtbar dumm hier? Ich fühle mich wie es muss eine elegantere Lösung.
InformationsquelleAutor der Frage Juan Antonio Gomez Moriano | 2012-10-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein möglicher Ansatz: wir pflegen eine Pfad-Liste, und Blick nach hinten zu finden, der übergeordnete Knoten(s).
InformationsquelleAutor der Antwort nneonneo
pulldom ist hervorragend. Erhalten Sie einen sax-stream. Sie können eine Iteration der stream, und wenn Sie finden einen Knoten, der Ihren interessiert sind, laden Sie, dass die Knoten in einer dom-fragment.
Ausgabe:
InformationsquelleAutor der Antwort Gary van der Merwe