我想选择特定元素(subelement
)的第一个子元素,但是这个子元素的命名空间与父元素的命名空间不同。此外,这个子元素可以属于任何命名空间。
xml = '''<root xmlns="default_ns">
<subelement>
<!-- here we can have an element of any namespace -->
<some_prefix:a xmlns:some_prefix="some_namespace">
<some_prefix:b/>
</some_prefix:a>
</subelement>
</root>'''
root = etree.fromstring(xml)
evaluator = etree.XPathEvaluator(root, namespaces={'def':'default_ns'})
child = evaluator.evaluate('//def:subelement/child::*')[0]
a_string = etree.tostring(child)
print a_string
这将会得到:
<some_prefix:a xmlns:some_prefix="some_namespace" xmlns="default_ns">
<some_prefix:b/>
</some_prefix:a>
但我想得到的是来自父元素 xmlns="default_ns"
的没有命名空间声明的子元素:
<some_prefix:a xmlns:some_prefix="some_namespace">
<some_prefix:b/>
</some_prefix:a>
child = deepcopy(child) etree.cleanup_namespaces(child)
。 - Marcinetree.cleanup_namespaces
是不必要的。只需要使用deepcopy
来删除不需要的命名空间即可。deepcopy
函数来自于 copy 模块。这是最终代码: child = evaluator.evaluate('//def:subelement/child::*')[0]child = deepcopy(child) a_string = etree.tostring(child) - Marcin