Seite 1 von 1

Frage zum Parsen von XML per DOM

Verfasst: Freitag 30. Juni 2006, 14:14
von keboo
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 :)

Verfasst: Freitag 30. Juni 2006, 14:25
von Leonidas
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)]

Verfasst: Freitag 30. Juni 2006, 14:49
von keboo
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

Verfasst: Freitag 30. Juni 2006, 15:39
von Leonidas
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]

Verfasst: Freitag 30. Juni 2006, 17:37
von 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

Verfasst: Freitag 30. Juni 2006, 19:52
von keboo
Hi!

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

Danke,

Johannes

Verfasst: Freitag 30. Juni 2006, 19:54
von DatenMetzgerX
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

Verfasst: Freitag 30. Juni 2006, 20:27
von Leonidas
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.

Verfasst: Samstag 1. Juli 2006, 15:25
von keboo
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