LXML XPath无法定位XML根节点下子标签的解决方案咨询
解决lxml XPath无法找到带命名空间的XML节点问题
问题场景
你的XML文档结构如下:
<MyXmlRoot> <App xmlns='urn:SomethingSomething1'> ... </App> <User xmlns='urn:SomethingSomething2'> ... </User> <Doc xmlns='urn:SomethingSomething3'> <level2> <level3> <level4> <level5> <level6> <level7> <level8> <level9> <level10>Content at the deepest level</level10> </level9> </level8> </level7> </level6> </level5> </level4> </level3> </level2> </Doc>
使用lxml解析的代码:
tree = etree.parse("textxml.xml") root = tree.getroot()
执行root.xpath('//level10/text()')时返回空列表,核心原因是<Doc>节点带有urn:SomethingSomething3命名空间,其下所有子节点(包括level10)都会继承这个命名空间,而XPath默认不会匹配带命名空间的节点。
解决方案
方法一:显式指定命名空间映射(推荐)
定义命名空间前缀,在XPath中使用前缀定位目标节点:
tree = etree.parse("textxml.xml") root = tree.getroot() # 自定义命名空间前缀,这里用'd'代表Doc的命名空间 ns_map = {'d': 'urn:SomethingSomething3'} # 在XPath中通过前缀引用命名空间 content = root.xpath('//d:level10/text()', namespaces=ns_map) print(content) # 输出: ['Content at the deepest level']
方法二:忽略命名空间匹配节点(不推荐)
如果不需要区分命名空间,可以用local-name()匹配节点的本地名称:
content = root.xpath('//*[local-name()="level10"]/text()') print(content)
这种方法的弊端是:如果XML中存在其他命名空间下的同名节点,会一并查询出来,无法精准定位目标节点。
内容的提问来源于stack exchange,提问作者Vladimir Zaguzin
相关产品推荐
相关产品推荐

