Frage zum Parsen von XML per DOM

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
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Hallo Leute,

Wie bekomme ich die Namen aller Tags eines gegebenen Nodes (Knoten im Beispiel) in eine Liste? Die Liste soll so aus aussehen:

Code: Alles auswählen

tag_list=['tag1','tag2','tag3','tag4']
XML-Datei:

Code: Alles auswählen


<xml>

<Knoten>

<tag1>... info ...</tag1>
<tag2>... info ...</tag2>
<tag3>... info ...</tag3>
<tag4>... info ...</tag4>

</Knoten>

</xml>

Ich arbeite mit dem DOM Parser. Irgendwie muss ich hier immer den Namen der Tags ( .getElementsByTagName )angeben, um die Werte zu bestimmen. Leider verändern sich die Tags in meinen Input XML Files.

Danke für Eure Unterstützung!

Johannes :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich hätte sowas anzubieten:

Code: Alles auswählen

import xml.dom.minidom
s = """<xml>

<Knoten>

<tag1>... info ...</tag1>
<tag2>... info ...</tag2>
<tag3>... info ...</tag3>
<tag4>... info ...</tag4>

</Knoten>

</xml>"""

dom = xml.dom.minidom.parseString(s)

print [dom.getElementsByTagName('tag' + str(num))[0] for num in range(1,5)]
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Hi Leonidas!

Ich habs leider ein wenig zu einfach gemacht mein Beispiel XML File.

Die Tags können irgendwie heissen. Statt tag1, tag2, tag3 und tag4 können irgenwelche willkürlichen Namen stehen, die keiner Ordnung entsprechen.

Sorry für die unklare Angabe des Problems.

LG
Johannes
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Okay, kein Problem, dann ersetzt du einfach die Letzte Zeile dadurch:

Code: Alles auswählen

print [child for child in dom.getElementsByTagName('Knoten')[0].childNodes if child.nodeType != 3]
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Und von mir wieder eine ElementTree Lösung:

Code: Alles auswählen

from operator import attrgetter
from elementtree import ElementTree as etree

source = """<xml>

<Knoten>
 <tag1>... info ...</tag1>
 <tag2>... info ...</tag2>
 <tag3>... info ...</tag3>
 <tag4>... info ...</tag4>

</Knoten>
</xml>"""

root = etree.fromstring(source)
tags = map(attrgetter('tag'), root.find('Knoten'))
print tags
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Hi!

Gibts da nicht irgendwie auch eine Lösung mit DOM?

Danke,

Johannes
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Leonidas hat geschrieben:Ich hätte sowas anzubieten:

Code: Alles auswählen

import xml.dom.minidom
s = """<xml>

<Knoten>

<tag1>... info ...</tag1>
<tag2>... info ...</tag2>
<tag3>... info ...</tag3>
<tag4>... info ...</tag4>

</Knoten>

</xml>"""

dom = xml.dom.minidom.parseString(s)

print [dom.getElementsByTagName('tag' + str(num))[0] for num in range(1,5)]
minidom ist doch dom ???
Und wenn abgespeckt
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

keboo hat geschrieben:Gibts da nicht irgendwie auch eine Lösung mit DOM?
Wo ist das Problem mit Minidom? Minidom ist auch eine DOM-Implementation.
Minidom-Duku hat geschrieben:xml.dom.minidom is a light-weight implementation of the Document Object Model interface. It is intended to be simpler than the full DOM and also significantly smaller.
Aber davon abgesehen ist ElementTree/lxml einfach pythonischer, der Code sieht wesentlich besser aus.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Hi Leonidas,

Sorry hab gestern abends deinen Eintrag übersehen, in dem du die Zeile ersetzt hast. Sorry.

Danke! Das war was ich gesucht hatte.

Johannes
Antworten