如何在 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 表达式的行为会有所不同。

只要每个&lt;production&gt; 恰好有一个&lt;category&gt; 子级,这在实践中没有任何区别,就像在您的简短示例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()?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 XPath 中使用“not”?

如何在xpath中使用contains查找元素

如何在这里使用 XPath contains()?

xpath常用函数

如何在 XPath“包含”函数中使用正则表达式

如果搜索参数为空白或缺失/错误,我如何使用 Xpath 函数“contains()”不返回任何内容?