XPath如何判断指定节点不存在 实现多条件XML节点筛选
XPath 实现「特定节点不存在+指定参数值匹配」的客户筛选
核心实现方法
XPath 中判断指定节点不存在,直接使用内置的not()函数包裹目标节点的匹配路径即可:当包裹的路径匹配不到任何节点时,not()会返回布尔值true,正好对应你需要的「Id为111的Param节点不存在」的判断条件。
满足你需求的完整XPath表达式
Customers/Customer[not(Params/Param[Id/text()='111'])][Params/Param[Id/text()='112']/Value/text()='ON']/Username/text()
表达式逻辑拆解
[not(Params/Param[Id/text()='111'])]:校验当前Customer节点下,不存在Id值为111的Param子节点,适配你提到的「111参数为空时对应节点不会出现在结构中」的返回规则[Params/Param[Id/text()='112']/Value/text()='ON']:和你之前可用的表达式逻辑一致,校验当前Customer下Id为112的Param节点值为ON- 末尾的
/Username/text():提取符合所有筛选条件的客户用户名
用你提供的示例XML运行该表达式,会正确返回预期结果userThree。
扩展:合并两类筛选规则
如果后续需要同时查出两类符合要求的客户(111参数为"Param 1 is on"且112为"OFF"、111节点不存在且112为"ON"),可以用and/or逻辑符组合条件,参考写法:
Customers/Customer[ (Params/Param[Id/text()='111']/Value/text()='Param 1 is on' and Params/Param[Id/text()='112']/Value/text()='OFF') or (not(Params/Param[Id/text()='111']) and Params/Param[Id/text()='112']/Value/text()='ON') ]/Username/text()
该表达式在你的示例XML中会返回userOne、userTwo、userThree三个结果。
内容的提问来源于stack exchange,提问作者BenLendvai
相关产品推荐
相关产品推荐

