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

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
danims
User
Beiträge: 29
Registriert: Montag 19. Februar 2007, 20:23
Wohnort: Bern, Schweiz

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
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'
Antworten