为什么XPath仅选中首个元素文本?如何匹配allFiles下动态名称子节点
正确查询方案
核心XPath表达式
要选中allFiles下所有动态生成的子节点,无需指定具体节点名,使用以下表达式即可:
/JSON/allFiles/*
该表达式的语义为:匹配根节点<JSON>下<allFiles>节点的所有直接子元素节点,不受子节点名称限制。
异常原因说明
你使用该表达式仅返回第一个子节点内容,是所使用的XPath查询工具/API默认仅返回第一条匹配结果导致,而非表达式本身错误。不同场景下的正确处理逻辑如下:
- Python lxml库:
xpath()方法默认返回所有匹配节点的列表,遍历列表即可获取全部子节点 - 浏览器
document.evaluateAPI:需要指定XPathResult.ORDERED_NODE_ITERATOR_TYPE类型,迭代遍历所有返回结果 - 桌面端XML测试工具:在工具设置中开启「返回所有匹配结果」选项即可
拓展查询写法
如果需要直接提取每个动态子节点下的字段值,可以直接在表达式中拓展:
- 提取所有动态节点的
name字段值:/JSON/allFiles/*/name/text() - 筛选
status为Pending的动态节点:/JSON/allFiles/*[status/text()='Pending']
验证示例(Python lxml)
from lxml import etree # 填入你的XML内容 xml_content = '''<?xml version="1.0" encoding="UTF-8"?> <JSON> <allFiles> <_Mna81v3-W_7WC1w69n9> <name type="string">File1</name> <reason type="string">Issue1</reason> <status type="string">Pending</status> <submissionTime type="string">11/3/2021, 10:11:37 AM</submissionTime> </_Mna81v3-W_7WC1w69n9> <_Mna83OkLF8vB8fV6CIy> <name type="string">File2</name> <reason type="string">Other</reason> <status type="string">Pending</status> <submissionTime type="string">11/3/2021, 10:11:44 AM</submissionTime> </_Mna83OkLF8vB8fV6CIy> </allFiles> </JSON>''' root = etree.fromstring(xml_content.encode("utf-8")) # 查询所有动态子节点 dynamic_nodes = root.xpath("/JSON/allFiles/*") print(f"匹配到的动态节点数量:{len(dynamic_nodes)}") for node in dynamic_nodes: print(f"节点名:{node.tag},对应文件名:{node.xpath('./name/text()')[0]}")
运行输出:
匹配到的动态节点数量:2 节点名:_Mna81v3-W_7WC1w69n9,对应文件名:File1 节点名:_Mna83OkLF8vB8fV6CIy,对应文件名:File2
内容的提问来源于stack exchange,提问作者ZeroByZero
相关产品推荐
相关产品推荐

