如何使用XPath结合多属性值获取XML文档的子节点
嘿,这就来教你怎么用XPath结合多属性值精准定位XML里的子节点!先结合你给出的XML结构,一步步拆解说明~
首先先把你提供的XML结构整理一下(方便后续举例):
<Commodity name="coffee" title="Coffee" value="7"> <Specs>..元素已移除</Specs> <ContractMonths lasttradedaterule="Eight business days prior to the last business day of the delivery month" firstnoticedaterule="Seven business days prior to first business day of delivery month"> ..元素已移除 </ContractMonths> <Options tf="true"> <OptionMonths delimeter="comma" expirationdaterule="Second Friday of the calendar month"> ..元素已移除 </OptionMonths> </Options> </Commodity>
核心语法:多属性匹配的XPath写法
要同时匹配节点的多个属性值,核心就是用and连接多个@属性名='属性值'的条件,基本格式是:
//目标节点[@属性1='值1' and @属性2='值2']
下面结合你的XML场景具体举例:
场景1:精准匹配单个节点的多属性
比如你想定位<OptionMonths>节点,要求它同时满足delimeter="comma"和expirationdaterule="Second Friday of the calendar month",对应的XPath就是:
//OptionMonths[@delimeter='comma' and @expirationdaterule='Second Friday of the calendar month']
再比如定位<ContractMonths>节点,同时匹配它的两个日期规则属性:
//ContractMonths[@lasttradedaterule='Eight business days prior to the last business day of the delivery month' and @firstnoticedaterule='Seven business days prior to first business day of delivery month']
场景2:结合父节点层级缩小范围
如果XML里有多个同类型节点,你可以先定位父节点,再找它的子节点,这样更精准。比如先找到name="coffee"的<Commodity>节点,再定位它下面tf="true"的<Options>子节点:
//Commodity[@name='coffee']/Options[@tf='true']
这里用/代替//,表示只找<Commodity>的直接子节点<Options>,避免匹配到其他层级的同名节点。
进阶:部分匹配属性值
如果属性值很长,你不想写全量内容,可以用contains()函数匹配包含指定字符串的属性。比如要找<OptionMonths>节点,只要expirationdaterule里包含"Second Friday"即可,同时满足delimeter="comma":
//OptionMonths[@delimeter='comma' and contains(@expirationdaterule, 'Second Friday')]
关键总结
- 多属性同时匹配:用
and连接多个@属性='值'条件 - 层级定位:用
//递归查找,/定位直接子节点,缩小查找范围 - 灵活函数:
contains()、starts-with()等可以处理非精准匹配的场景
内容的提问来源于stack exchange,提问作者dinotom
相关产品推荐
相关产品推荐

