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:
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