16

有没有办法忽略标签名称中的 XML 命名空间elementtree.ElementTree

我尝试打印所有technicalContact标签:

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

我得到类似的东西:

{http://www.example.com}technicalContact blah@example.com

但我真正想要的是:

technicalContact blah@example.com

有没有办法只显示后缀(sans xmlns),或者更好 - 在不明确说明 xmlns 的情况下迭代元素?

4

2 回答 2

8

您可以定义一个生成器以递归方式搜索元素树,以便找到以适当标签名称结尾的标签。例如,像这样:

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
于 2012-06-27T13:25:56.807 回答
1

我总是最终使用类似的东西

item.tag.split("}")[1][0:]
于 2012-06-27T13:00:24.257 回答