python: xml.etree.ElementTree, удаляя «пространства имен» - PullRequest
26 голосов
/ 10 ноября 2009

Мне нравится, как ElementTree анализирует xml, в частности функцию Xpath. У меня есть вывод в XML из приложения с вложенными тегами.

Я бы хотел получить доступ к этим тегам по имени без указания пространства имен, возможно ли это? Например:

root.findall("/molpro/job")

вместо:

root.findall("{http://www.molpro.net/schema/molpro2006}molpro/{http://www.molpro.net/schema/molpro2006}job")

Ответы [ 2 ]

8 голосов
/ 10 ноября 2009

По крайней мере, с lxml2, возможно несколько уменьшить эти издержки:

root.findall("/n:molpro/n:job",
             namespaces=dict(n="http://www.molpro.net/schema/molpro2006"))
5 голосов
/ 10 ноября 2009

Вы можете написать свою собственную функцию, чтобы обернуть неприятно выглядящие биты, например:

def my_xpath(doc, ns, xp);
    num = xp.count('/')
    new_xp = xp.replace('/', '/{%s}')
    ns_tup = (ns,) * num
    doc.findall(new_xp % ns_tup)

namespace = 'http://www.molpro.net/schema/molpro2006'
my_xpath(root, namespace, '/molpro/job')

Признаюсь, это не так весело, но, по крайней мере, вы сможете читать выражения xpath.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...