Разобрать XML с Python Etree и возвратить указанный тэг независимо от пространства имен - PullRequest
7 голосов
/ 20 ноября 2011

Я работаю с некоторыми данными XML, которые в некоторых местах каждого файла переопределяют пространство имен. Я пытаюсь извлечь все теги определенного типа из документа независимо от того, какое пространство имен активно в точке, где тег находится в XML.

Я использую findall('.//{namespace}Tag'), чтобы найти искомые элементы. Но никогда не зная, что будет {namespace} в любой заданной точке файла, он попадет или пропустит, получу ли я все запрошенные теги или нет.

Есть ли способ вернуть все элементы тега независимо от того, под которым они находятся {namespace}? Что-то вроде findall('.//{wildcard}Tag')?

1 Ответ

3 голосов
/ 17 апреля 2012

Функция xpath в lxml поддерживает local-name ()!

Вот пример Python 3:

import io
from lxml import etree
xmlstring = '''<root
xmlns:m="http://www.w3.org/html4/"
xmlns:n="http://www.w3.org/html5/">
<m:table>
  <m:tr>
    <m:name>Sometext</m:name>
  </m:tr>
</m:table>
<n:table>
  <n:name>Othertext</n:name>
</n:table>
</root>'''
root = etree.parse(io.StringIO(xmlstring))
names = root.xpath("//*[local-name() = 'name']")
for name in names:
    print(name.text)

Возможно, на ваш вопрос раньше уже отвечали по адресу: lxmlПроблема пространства имен etree xmlparser

...