2012-03-31 3 views
0

Ich habe gelernt, wie Sie Teile von XML mit der Funktion dom.minidom extrahieren, und ich kann bestimmte Elemente und Attribute erfolgreich zurückgeben.Gibt es eine formale Methode zum "Gehen" von XML in Python?

Ich habe eine Reihe von großen XML-Dateien, die ich analysieren möchte, und schiebe alle Ergebnisse in eine db. Gibt es eine Funktion wie os.walk, mit der ich Elemente aus dem XML auf eine logische Weise extrahieren und extrahieren kann, die die hierarchische Struktur erhält?

Die XML ist ziemlich einfach und ist sehr einfach:

<InternalSignature ID="9" Specificity="Generic"> 
<ByteSequence Reference="BOFoffset"> 
    <SubSequence Position="1" SubSeqMinOffset="0" SubSeqMaxOffset="0" MinFragLength="0"> 
    <Sequence>49492A00</Sequence> 
    <DefaultShift>5</DefaultShift> 
    <Shift Byte="00">1</Shift> 
    <Shift Byte="2A">2</Shift> 
    <Shift Byte="49">3</Shift> 
    </SubSequence> 
</ByteSequence> 
</InternalSignature> 
<InternalSignature ID="10" Specificity="Generic"> 
<ByteSequence Reference="BOFoffset"> 
    <SubSequence Position="1" SubSeqMinOffset="0" SubSeqMaxOffset="0" MinFragLength="0"> 
    <Sequence>4D4D002A</Sequence> 
    <DefaultShift>5</DefaultShift> 
    <Shift Byte="2A">1</Shift> 
    <Shift Byte="00">2</Shift> 
    <Shift Byte="4D">3</Shift> 
    </SubSequence> 
</ByteSequence> 
</InternalSignature> 

Gibt es eine formale Methode, um die XML der kriechenden und (in diesem kleinen Beispiel) Extrahieren der Elemente, die für jeden spezifischen InternalSignature beziehen? Ich kann sehen, wie man Dinge über eine Liste mit den Methoden minidom.parse und .GetElementsByName aufruft, aber ich bin nicht sicher, wie Sie Elemente in ihre hierarchische Darstellung assoziieren.

Bisher hat ich ein Tutorial gefunden, die zeigen, wie verschiedene Werte zurückgeben:

xmldoc = minidom.parse("file.xml") 
Versionlist = xmldoc.getElementsByTagName('FFSignatureFile') 
VersionRef = Versionlist[0] 
Version = VersionRef.attributes["Version"] 
DateCreated = VersionRef.attributes["DateCreated"] 
print Version.value 
print DateCreated.value 
InternalSignatureList = xmldoc.getElementsByTagName('InternalSignature') 
InternalSignatureRef = InternalSignatureList[0] 
SigID = InternalSignatureRef.attributes["ID"] 
SigSpecificity = InternalSignatureRef.attributes["Specificity"] 
print SigID.value 
print SigSpecificity.value 
print len(InternalSignatureList) 

ich von der letzten Zeile sehen (len), dass es 134 Elemente in dem InternalSignatureList ist, und im Wesentlichen möchte ich in der Lage sein, alle Elemente in jeder InternalSignature als einzelnen Datensatz zu extrahieren und in eine db zu streichen.

+0

Umm, ich bin nicht sicher, ob ich die Frage verstehen, aber wie wäre es [XPath] (http://en.wikipedia.org/wiki/XPath) (möglich in Kombination mit 'getchildren()' - zumindest 'lxml' unterstützt die Verwendung eines XML-Baums. – Kimvais

Antwort

3

(Was haben Sie versucht?)

from xml.etree import ElementTree 

e = ElementTree.fromstring(xmlstring) 
e.findall("ByteSequence") 
+0

Wow. Ich habe das gerade in Google gefunden. Und gute Antwort +1. – Glycerine

Verwandte Themen