WPF XmlNodeList多节点属性的SelectNodes查询及XPath构建需求
XPath 构建方案
需求概述
需要构建两条XPath,用于从XML中获取符合以下条件的Procedure节点的description:
- 该
Procedure下的所有Step节点的finished属性值均为"True" - 该
Procedure下的仅一个Step节点的finished属性值为"True"
无效代码分析
原尝试代码:
XmlNodeList testList = doc.SelectNodes("//Procedure/description[//Step/@finished='True']");
这段代码仅能匹配包含至少一个finished="True"的Step的Procedure,无法区分“所有Step都为True”或“仅一个Step为True”的场景,不符合需求。
正确XPath实现
1. 匹配所有Step的finished属性均为"True"的Procedure的description
//Procedure[not(Step/@finished!='True')]/description
等价的直观写法:
//Procedure[count(Step) = count(Step[@finished='True'])]/description
逻辑说明:
- 第一种写法:筛选不存在
finished属性不等于"True"的Step的Procedure,即所有Step的finished均为"True" - 第二种写法:对比
Procedure下Step的总数与finished="True"的Step数量,两者相等则说明所有Step都符合条件
2. 匹配仅一个Step的finished属性为"True"的Procedure的description
//Procedure[count(Step[@finished='True']) = 1]/description
逻辑说明:直接统计Procedure下finished="True"的Step数量,等于1的即为符合条件的节点。
示例XML(参考)
<Root> <Procedure> <description>所有步骤已完成</description> <Step finished="True"/> <Step finished="True"/> </Procedure> <Procedure> <description>仅一个步骤完成</description> <Step finished="True"/> <Step finished="False"/> </Procedure> <Procedure> <description>无步骤完成</description> <Step finished="False"/> <Step finished="False"/> </Procedure> </Root>
内容的提问来源于stack exchange,提问作者Benzi
相关产品推荐
相关产品推荐

