如何在 XPath 中使用 not contains()?
Posted
技术标签:
【中文标题】如何在 XPath 中使用 not contains()?【英文标题】:How to use not contains() in XPath? 【发布时间】:2012-06-16 22:53:36 【问题描述】:我有一些结构如下的 XML:
<whatson>
<productions>
<production>
<category>Film</category>
</production>
<production>
<category>Business</category>
</production>
<production>
<category>Business training</category>
</production>
</productions>
</whatson>
而且我需要选择每个类别不包含“业务”的作品(因此在本例中只选择第一个作品)。
这对 XPath 可行吗?我尝试按照这些思路工作,但一无所获:
//production[not(contains(category,'business'))]
【问题讨论】:
【参考方案1】:XPath 查询区分大小写。看了你的例子(顺便说一句,这很棒,似乎没有人再提供例子了!),我可以通过将“业务”更改为“业务”来获得您想要的结果
//production[not(contains(category,'Business'))]
我已经通过在 Chrome 中打开 XML 文件并使用开发者工具执行 XPath 查询进行了测试,它只返回了电影类别。
【讨论】:
感谢您在 Chrome 中打开 XML 并使用开发人员工具验证 XPath 是否有效的建议!我只是想找一个在线检查器,你的建议要简单得多。 你可以在没有包含的情况下使用 //production[not(@category='Business')] 吗? @YiXiangChong 如果您不想进行包含搜索,当然可以,但这篇原始帖子正在执行包含搜索(因为并非所有元素都明确等于“业务”)【参考方案2】:我需要选择每个类别不包含“业务”的作品
虽然我赞成@Arran 的回答是正确的,但我也会添加这个... 严格解释,OP 的规范将被实现为
//production[category[not(contains(., 'Business'))]]
而不是
//production[not(contains(category, 'Business'))]
后者选择 first category
子级不包含“Business”的每个产品。当 production
没有 category
子代或多个子代时,这两个 XPath 表达式的行为会有所不同。
只要每个<production>
恰好有一个<category>
子级,这在实践中没有任何区别,就像在您的简短示例XML 中一样。您是否总是可以指望这是否正确,取决于各种因素,例如您是否有一个实施该约束的模式。就个人而言,我会选择更强大的选项,因为它不会“花费”太多......假设问题中所述的要求确实正确(而不是例如'选择没有类别的每个产品包含“业务”')。
【讨论】:
@LoamyHound:感谢指正!两年多后,我终于看到了你的答案,并修复了丢失的括号。【参考方案3】:你可以使用not(expression)
函数
not()
是 xpath 中的函数(与运算符相对)
例子:
//a[not(contains(@id, 'xx'))]
或
expression != true()
【讨论】:
【参考方案4】:应该是没有 contains() 方法的 xpath,//production[not(contains(category,'business'))]
【讨论】:
以上是关于如何在 XPath 中使用 not contains()?的主要内容,如果未能解决你的问题,请参考以下文章