Seite 1 von 1

Node values aus XML sind "None" (benutze minidom)

Verfasst: Montag 21. Januar 2008, 11:18
von danims
Hallo

Mit Minidom parse ich ein relativ grosses XML-File und möchte die Values auslesen, dies klappt aber nicht (oder ich mache etwas falsch) :-)

Hier ein (sehr stark vereinfachtes :)) XML file:

Code: Alles auswählen

<addresses>
    <person id="1">
        <name>Daniel</name>
    </person>
</addresses>
Nun möchte ich irgendwie an "Daniel" gelangen. Hier ist der entsprechende Python-Code, den ich genutzt habe:

Code: Alles auswählen

from xml.dom import minidom
# Parse XML
xmldoc = minidom.parse(test.xml)

# get all <person>-tags
personlist = xmldoc.getElementsByTagName('person')

# Test: Print out the value of person id 1 (python starts counting at 0)
print personlist[0].toxml()
Das geht, da bekomme ich:
<name>Daniel</name>

Ich möchte aber irgendwie nur den Value haben, d.h. ohne die Tags. Wenn ich folgendes nutze, erhalte ich die Ausgabe "None":

Code: Alles auswählen

print personlist[0].nodeValue
Kann mir jemand helfen? Ich hab so viele Google Anfragen dazu gemacht und bin doch nicht weitergekommen :-(

Danke

Verfasst: Montag 21. Januar 2008, 11:46
von BlackJack
Bitte immer Quelltext posten den Du auch wirklich ausprobiert hast und der zu den Ergebnissen passt. Wenn man den Fehler in Zeile 4 behebt (keine Anführungszeichen um 'test.xml') kommt da nämlich etwas anderes heraus:

Code: Alles auswählen

In [56]: from xml.dom import minidom

In [57]: xmldoc = minidom.parse('test.xml')

In [58]: personlist = xmldoc.getElementsByTagName('person')

In [59]: print personlist[0].toxml()
<person id="1">
   <name>Daniel</name>
 </person>
Bei DOM sind Texte eigene Knoten, d.h. Du musst bis zu dem Textknoten herunter und dort dann den Wert abfragen.

Ich bevorzuge für XML ja `ElementTree`, das seit Python 2.5 sogar zur Standardbibliothek gehört:

Code: Alles auswählen

In [76]: from xml.etree import ElementTree as etree

In [77]: doc = etree.parse('test.xml')

In [78]: persons = doc.findall('//person/name')

In [79]: persons[0].text
Out[79]: 'Daniel'