Seite 1 von 1

XML-Baum in Klasse abbilden

Verfasst: Dienstag 23. Oktober 2007, 10:22
von nkoehring
Hallo...

ich moechte einen XML-Baum in einer Klasse abbilden, damit ich damit so aehnlich umgehen kann, wie zB bei BeautifulStoneSoup:

Code: Alles auswählen

    root.sub.content
    root.sub2.subsub1.subsubsub.content
Gibts da bereits einen einfachen Weg, der mich an einer selbstgebauten rekursiven Funktion vorbei fuehrt, aber auch in der StandardLibrary enthalten ist?

Verfasst: Dienstag 23. Oktober 2007, 13:50
von Y0Gi
Was spricht gegen ElementTree?

Verfasst: Dienstag 23. Oktober 2007, 15:09
von nkoehring
Kann ich denn mit ElementTree so arbeiten? Entweder ich mache es falsch oder es ist mir einfach zu umstaendlich und vorallem unuebersichtlich, statt

Code: Alles auswählen

root.something.foo.bar.contents[0]
sowas wie

Code: Alles auswählen

root.find(namespace+"something").find(namespace+"foo").find(namespace+"bar").text
tippen zu mussen -.-

Verfasst: Dienstag 23. Oktober 2007, 15:50
von Y0Gi
Schau dir mal die XPath-Syntax an.

Verfasst: Dienstag 23. Oktober 2007, 16:00
von BlackJack
Wenn's auch etwas ausserhalb der Standardbibliothek sein darf: http://codespeak.net/lxml/objectify.html

Verfasst: Dienstag 23. Oktober 2007, 16:05
von nkoehring
danke fuer die Tipps... ich hab nach Absprache nun doch einfach direkt auf BeautifulStoneSoup zurueck gegriffen...
Aber XPath schau ich mir trotzdem bei Gelegenheit mal an...

EDIT: Achja... gibts eigentlich nen direkten Weg mit BeautifulStoneSoup auf Elemente mit Strich im Namen zuzugreifen? Also alá root.bla.blub-mit-strich (was ja nun nicht geht, da der strich als minus interpretiert wird). Bisher muss ich dafuer etwas in der Richtung root.bla.findChild("blub-mit-strich") machen.

Verfasst: Mittwoch 24. Oktober 2007, 09:57
von HarryPython
Hi nkoehring


Vielleicht sowas:

Code: Alles auswählen

from xml.etree import cElementTree


blabla = cElementTree.parse("bla.xml")

blub = blabla.findall("//something")



for i in blub:
    knoten = self.tree_ctrl_1.AppendItem( i.find("somthingname").text)
Lösund ist das "//" dadurch sparst du dir das findfindfind...

Wie schon erwähnt ist xPath die Lösung
Hier findest du die Anleitung und die Bibliothek, die aber ab 2.5 wohl schon dabei sein soll. [/url]

Gruß
HarryPython