Ich muss XML-Dokumente behandeln, die groß genug sind (bis zu 1 GB) und analysieren sie mit Python. Ich benutze die iterparse() Funktion (SAX Style Parsing).ElementTree iterparse Strategie
Meine Sorge ist die folgende, stellen Sie sich eine XML haben wie diese
<?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, ist zu wissen, wenn ich einen Namen (wie Simpsons) bin immer und wenn ich den Namen bin immer von einem dieser Familienmitglieder (zum Beispiel Homer)
Was ich bisher gemacht habe, ist die Verwendung von "Schaltern", die mir sagen, ob ich innerhalb eines "Mitglieder" -Tags bin oder nicht, der Code wird so 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 das funktioniert gut, wie die Ausgabe
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, dass in dem Tag war ich (on_members_tag) vorstellt, mit den wahren xml Beispielen zu wissen, mit diesem (einfachen) Beispiel ist musste er eine zusätzliche Variable erstellen das muss ich behandeln, sie haben mehr verschachtelte Tags.
Beachten Sie auch, dass dies ein sehr reduziertes Beispiel ist. Sie können also davon ausgehen, dass ich möglicherweise mit mehr Tags, mehr inneren Tags und anderen Tag-Namen, Attributen usw. konfrontiert werde.
Also Frage ist. Mache ich hier etwas schrecklich Dummes? Ich habe das Gefühl, dass es eine elegantere Lösung dafür geben muss.
Was werden Sie mit den Daten zu tun? Konstruieren Sie eine Python-Datenstruktur, um alles zu speichern, oder speichern Sie sie während der Iteration in db oder etwas anderes? –
@JanneKarila: Die Daten könnten auf Python-Struktur, speichern in db oder dump in eine Datei gesetzt werden, es würde auf den Prozess abhängen, in diesem Fall können Sie davon ausgehen, dass es in db geschrieben wird –