You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:22:45