Разбор XML, где префикс элемента определен в том же элементе - PullRequest
0 голосов
/ 17 мая 2018

У меня есть XML-файл с элементом, который выглядит следующим образом:

<wrapping_element>
    <prefix:tag xmlns:prefix="url">value</prefix:tag>
</wrapping_element>

Я хочу получить этот элемент, поэтому я использую lxml следующим образом:

wrapping_element.find('prefix:tag', wrapping_element.nsmap)

но я получаю следующую ошибку: SyntaxError: prefix 'prefix' not found in prefix map, поскольку prefix не определен до достижения этого элемента в XML.

Есть ли способ получить элемент в любом случае?

1 Ответ

0 голосов
/ 17 мая 2018

Как упоминалось в комментариях, вы могли бы использовать local-name(), чтобы обойти пространство имен, но достаточно просто просто обработать пространство имен непосредственно в вызове xpath() ...

from lxml import etree

tree = etree.parse("input.xml")

wrapping_element = tree.xpath("/wrapping_element")[0]
tag = wrapping_element.xpath("x:tag", namespaces={"x": "url"})[0]

print(etree.tostring(tag, encoding="unicode"))

Это напечатает ...

<prefix:tag xmlns:prefix="url">value</prefix:tag>

Обратите внимание, что я использовал префикс x. Префикс может совпадать с префиксом в файле XML, но это не обязательно; только URI пространства имен должны точно совпадать.

Подробнее см. Здесь: http://lxml.de/xpathxslt.html#namespaces-and-prefixes

...