Umgang mit dem namespace bei lxml XPath

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
psyalex
User
Beiträge: 26
Registriert: Samstag 17. November 2007, 22:10
Wohnort: München

Dienstag 7. Oktober 2008, 10:39

Hallo,

ich versuche aus einem xml Dokument (content.xml eines odt files) bestimmte Tags zu finden. Dass ich den Namespace des Dokuments dabei berücksichtigen muss habe ich schon herausgefunden. Alle Tags mit einem bestimmten Namespace finde ich z.B. über den folgenden XPath Syntax:

Code: Alles auswählen

".//*[namespace-uri()='urn:oasis:names:tc:opendocument:xmlns:table:1.0']"
Das funktioniert! Nun finde ich aber einfach keine Möglichkeit auch das Tag anzugeben. Ohne den Namespace würde ich das z.B. so machen:

Code: Alles auswählen

".//TAGNAME"
Ich habe viele Kombinationen ausprobiert wovon die meisten aber zu einem "error in xpath expression" geührt haben. Auch im Internet habe ich keinen Hinweis oder Beispiel gefunden wie Tag und Namespace zu kombinieren sind.
Hat jemand eine Idee wie man Tag und Namespace zusammen bekommt?
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Dienstag 7. Oktober 2008, 11:47

Kurzes googlen sagt:

Code: Alles auswählen

[namespace-uri()='urn:oasis:names:tc:opendocument:xmlns:table:1.0' and local-name()='foobar']
doch müsste nicht auch `{urn:oasis:names:tc:opendocument:xmlns:table:1.0}foobar`gehen? Oder ist das nur eine Python-spezifische Besonderheit von ElementTree oder wie die eingebaute XML-Bibliothek auch immer hieß?

Stefan
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Dienstag 7. Oktober 2008, 12:07

Den Namespace in geschweiften Klammern vor ein Tag zu setzen ist IIRC die Clark-Notation. ElementTree unterstützt diese, möglicherweise als Ersatz zu einer anderen, evtl. komplexeren Implementierung. Bei anderen Libraries bin ich nicht sicher, lxml dürfte das aus Kompatibilitätsgründen allerdings ebenfalls tun.
psyalex
User
Beiträge: 26
Registriert: Samstag 17. November 2007, 22:10
Wohnort: München

Dienstag 7. Oktober 2008, 12:22

Vielen Dank!

... and local-name()=.. funktioniert. Ich hatte in der eckigen Klammer Sachen wie child()=... und node()=... ausprobiert und das Tag vor und hinter der Klammer, was aber wie gesagt alle nicht funktioniert hat.

'{...}Tag' scheint bei lxml.etree.XML Objekten zu funktionieren nicht aber bei XPath.

Alex

PS: Ich habe eine ganze Weile gegoogled aber scheinbar mit den falschen Begriffen.
Antworten