XPath筛选父节点非Item且文本为10的lbl节点出错求助
问题排查与修正:不符合预期的XPath表达式
你的XPath表达式之所以返回了不符合预期的节点,核心是语法使用逻辑错误,我来帮你拆解问题并修正:
问题根源
你写的表达式//lbl[text()='10']//not[parent::Item]存在两个关键问题:
- 错误调用
not()函数:not()是XPath的布尔判断函数,不是节点名称,你不能把它当作路径节点来查找。正确的用法是将判断逻辑包裹在not()函数内部,作为节点的筛选条件。 - 路径层级逻辑错误:你用
//在lbl节点后继续向下查找后代,但你需要判断的是当前lbl节点的父节点,不需要向下遍历,应该直接在lbl的筛选谓语中添加父节点的判断规则。
修正后的XPath表达式
XPathExpression expr = xpath.compile("//lbl[text()='10' and not(parent::Item)]");
表达式解释
//lbl:全局查找所有名称为lbl的节点[text()='10']:筛选出文本值严格等于10的lbl节点and not(parent::Item):同时排除父节点名称为Item的节点
验证示例XML
针对你提供的XML:
<XML> <Cat> <Summary> <Item> <lbl>10</lbl> </Item> </Summary> </Cat> </XML>
其中的<lbl>10</lbl>父节点正好是<Item>,使用修正后的表达式查询时,会返回空结果,完全符合你的预期。
内容的提问来源于stack exchange,提问作者YerivanLazerev
相关产品推荐
相关产品推荐

