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

Freitag 30. Juni 2006, 14:14

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 30. Juni 2006, 14:25

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

Freitag 30. Juni 2006, 14:49

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 30. Juni 2006, 15:39

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 Modvoice
BlackJack

Freitag 30. Juni 2006, 17:37

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

Freitag 30. Juni 2006, 19:52

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)

Freitag 30. Juni 2006, 19:54

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 30. Juni 2006, 20:27

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

Samstag 1. Juli 2006, 15:25

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