如何在xpath中使用not contains()?

时间:2012-06-13 22:12:15

标签: xpath contains

我有一些XML结构如下:

<whatson>
  <productions>    
    <production>
      <category>Film</category>
    </production>
    <production>
      <category>Business</category>
    </production>
    <production>
      <category>Business training</category>
    </production>
  </productions>
</whatson>

我需要选择一个类别并不包含&#34; Business&#34; (所以这只是本例中的第一个作品)。

xpath有可能吗?我尝试过沿着这些方向努力但却无处可去:

//production[not(contains(category,'business'))]

4 个答案:

答案 0 :(得分:105)

XPath查询区分大小写。看了你的例子(顺便说一句,很棒,没有人似乎再提供例子了!),我只需将“业务”改为“业务”即可得到你想要的结果

//production[not(contains(category,'Business'))]

我已经通过在Chrome中打开XML文件并使用开发人员工具执行XPath查询来测试了这一点,它只给了我电影类别。

答案 1 :(得分:25)

  

我需要选择不包含“商业”

类别的每个作品

虽然我赞成@Arran的回答是正确的,但我也会加上这个...... 严格解释,OP的规范将实现为

//production[category[not(contains(., 'Business'))]]

而不是

//production[not(contains(category, 'Business'))]

后者选择第一个 category孩子不包含“商家”的所有作品。当production没有category个子项或多个子项时,两个XPath表达式的行为会有所不同。

只要每个<production>只有一个<category>子项,在实践中没有任何区别,就像在简短的XML示例中一样。是否始终可以依赖于是否为真,取决于各种因素,例如您是否具有强制执行该约束的模式。就个人而言,我会选择更强大的选项,因为它不会“花费”太多......假设你在问题中陈述的要求是非常正确的(而不是例如'选择每个没有类别的产品)包含“商业”')。

答案 2 :(得分:1)

您可以使用not(expression)功能

not()是xpath中的函数(与运算符相对)

示例:

//a[not(contains(@id, 'xx'))]

OR

expression != true()

答案 3 :(得分:0)

应该// production [not(contains(category,'business'))]