如何基于子元素属性值使用XPath筛选指定Object元素
正确筛选符合条件的XML元素的XPath表达式
给定XML结构
<A> <Lot> <Of> <Various> <Parents> <Object NodeType="UsageType"> <Property Name="Descriptor" Value="A" Type="My.DescriptorType"/> [...] </Object> <Object NodeType="UsageType"> <Property Name="Descriptor" Value="B" Type="My.DescriptorType"/> [...] </Object> <Object NodeType="UsageType"> <Property Name="Descriptor" Value="C" Type="My.DescriptorType"/> [...] </Object> </Parents> </Various> </Of> </Lot> </A>
筛选需求
- 目标元素为
Object,且其NodeType属性值为UsageType - 该
Object包含一个子Property元素,需同时满足Name="Descriptor"且Value="B"
原表达式问题
你尝试的表达式:
//Object[@NodeType='UsageType' and Property@Name='Descriptor' and Property@Value='B']
存在两个问题:
- 语法错误:
Property@Name缺少括号,正确写法应为Property[@Name] - 逻辑问题:两个
Property条件是分别检查是否存在任意一个Property满足对应属性,无法确保是同一个Property元素同时具备两个属性。
正确的XPath表达式
方案1:直接限定同一个子元素谓词
这是最简洁通用的写法,把两个属性条件放到同一个Property的谓词中,确保匹配的是同一个子元素:
//Object[@NodeType='UsageType' and Property[@Name='Descriptor' and @Value='B']]
方案2:反向查找父元素
如果需要更明确的层级控制,可以先找到符合条件的Property,再回溯到它的父Object:
//Object[@NodeType='UsageType']/Property[@Name='Descriptor' and @Value='B']/..
以上两种表达式都会精准匹配到XML中第二个Object元素,也就是包含目标Property的节点。
内容的提问来源于stack exchange,提问作者J4N
相关产品推荐
相关产品推荐

