Richigen Knoten ermitteln

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
MissUnderstud
User
Beiträge: 3
Registriert: Dienstag 2. Mai 2006, 13:04

Mittwoch 10. Mai 2006, 14:32

Hallo,

ich möchte gerne auf einen bestimmten Knoten in einem XML-Dokument zugreifen, das wie folgt aussieht:

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<purchaseOrder>
 <c>
   <d>
    <daten>
        <item>
            <name/>
            <sku/>
            <price/>
            <qty/>
        </item>
        <item>
            <name>Bass Drum</name>
            <sku>223-322433</sku>
            <price>$3199.99</price>
            <qty>1</qty>
        </item>
    </daten>
    </d>
 </c>
</purchaseOrder>
Nun möchte ich den Wert "Bass Drum" haben. Ich habe schon einiges mit childNodes versucht, aber ich bin nie draufgekommen **grr*.
Kann mir jemand weiterhelfen?

Danke
MissUnderstud

Edit (BlackJack): Code in XML-Tags gesetzt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 10. Mai 2006, 14:56

MissUnderstud hat geschrieben:Hallo,

ich möchte gerne auf einen bestimmten Knoten in einem XML-Dokument zugreifen
Hi MissUnderstud!

Versucht mal BeautifulSoup. http://www.python-forum.de/topic-4664.html

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

xml = \
"""<?xml version="1.0" encoding="UTF-8"?>
<purchaseOrder>
<c>
<d>
<daten>
<item>
<name/>
<sku/>
<price/>
<qty/>
</item>
<item>
<name>Bass Drum</name>
<sku>223-322433</sku>
<price>$3199.99</price>
<qty>1</qty>
</item>
</daten>
</d>
</c>
</purchaseOrder>"""

from BeautifulSoup import BeautifulSoup

soup = BeautifulSoup(xml)

for name in soup("name"):
    print "item:", name.string
Ergebnis:

Code: Alles auswählen

item: Null
item: Bass Drum
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Mittwoch 10. Mai 2006, 22:25

Mit ElementTree geht's natürlich auch:

Code: Alles auswählen

import elementtree.ElementTree as etree

source = """\
<?xml version="1.0" encoding="UTF-8"?>
<purchaseOrder>
 <c>
   <d>
    <daten>
        <item>
            <name/>
            <sku/>
            <price/>
            <qty/>
        </item>
        <item>
            <name>Bass Drum</name>
            <sku>223-322433</sku>
            <price>$3199.99</price>
            <qty>1</qty>
        </item>
    </daten>
    </d>
 </c>
</purchaseOrder>"""

root = etree.fromstring(source)
for element in root.findall('.//name'):
    print element.text
MissUnderstud
User
Beiträge: 3
Registriert: Dienstag 2. Mai 2006, 13:04

Donnerstag 11. Mai 2006, 09:13

Danke erst mal für das Kompliment, Gerold......
und auch an BlackJack......

trotzdem noch eine klitzekleine Frage:
Geht der Zugriff auch mit den Standardmethoden/-funktionen von DOM?


Liebe Grüße
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 12. Mai 2006, 13:55

MissUnderstud hat geschrieben:Geht der Zugriff auch mit den Standardmethoden/-funktionen von DOM?
Klar doch:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*- 

from xml.dom.minidom import parse
dom = parse('drum.xml')

names = [name for name in dom.getElementsByTagName('name') if name.childNodes != []]
for name in names:
    print name.childNodes[0].nodeValue
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten