Seite 1 von 1

Umgang mit dem namespace bei lxml XPath

Verfasst: Dienstag 7. Oktober 2008, 10:39
von psyalex
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?

Verfasst: Dienstag 7. Oktober 2008, 11:47
von sma
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

Verfasst: Dienstag 7. Oktober 2008, 12:07
von Y0Gi
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.

Verfasst: Dienstag 7. Oktober 2008, 12:22
von psyalex
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.