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

Schreibe einen Kommentar