Python: игнорировать xmlns в elementtree.ElementTree

Есть ли способ игнорировать пространство имен XML в именах tage в elementtree.ElementTree?

Я пытаюсь напечатать все теги technicalContact:

for item in root.getiterator(tag='{http://www.example.com}technicalContact'):
        print item.tag, item.text

И я получаю что-то вроде:

{http://www.example.com}technicalContact [email protected]

Но я действительно хочу:

technicalContact [email protected]

Есть ли способ отобразить только суффикс (sans xmlns) или лучше - перебирать элементы без явного указания xmlns?

Ответы

Ответ 1

Вы можете определить генератор для рекурсивного поиска по дереву элементов, чтобы найти теги, которые заканчиваются соответствующим именем тега. Например, что-то вроде этого:

def get_element_by_tag(element, tag):
    if element.tag.endswith(tag):
        yield element
    for child in element:
        for g in get_element_by_tag(child, tag):
            yield g

Это просто проверяет теги, заканчивающиеся на tag, т.е. игнорируя любое ведущее пространство имен. Затем вы можете перебирать любой тег, который вы хотите, следующим образом:

for item in get_element_by_tag(elemettree, 'technicalContact'):
    ...

Этот генератор в действии:

>>> xml_str = """<root xmlns="http://www.example.com">
... <technicalContact>Test1</technicalContact>
... <technicalContact>Test2</technicalContact>
... </root>
... """

xml_etree = etree.fromstring(xml_str)

>>> for item in get_element_by_tag(xml_etree, 'technicalContact')
...     print item.tag, item.text
... 
{http://www.example.com}technicalContact Test1
{http://www.example.com}technicalContact Test2

Ответ 2

Я всегда получаю что-то вроде

item.tag.split("}")[1][0:]