这两种样式的xpath逻辑'和'等价吗?

时间:2009-12-14 15:31:28

标签: .net xpath

假设我有这样的xml:

<Products>
  <Product name="Liquid Oxygen">
    <Manufacturer name="Universal Exports" country="UK" />
  </Product>
  <Product name="Hydrazine">
    <Manufacturer name="ACME Inc." country="USA" />
  </Product>
  <Product name="Gaseous Oxygen" obsolete="true">
    <Manufacturer name="Universal Exports" country="UK" />
  </Product>
  <Product name="Liquid Nitrogen">
    <Manufacturer name="Penguins R Us" country="Antarctica" />
  </Product>
</Products>

我想挑选具有Manufacturer子节点@country UK但没有@obsolete true的产品节点}。我可以说

/Products/Product[Manufacturer/@country = 'UK' and not(@obsolete = 'true)]

/Products/Product[Manufacturer/@country = 'UK'][not(@obsolete = 'true')]

并且都得到了我想要的节点。

我的问题是,这两种方法和条件之间是否有任何功能差异?是否存在不同方法可能产生不同结果的情况? (我意识到and在更复杂的条件下起作用)在风格上,一个比另一个更受欢迎?

(我正在使用C#和.NET 2.0,但我不认为这会对答案有任何影响)

4 个答案:

答案 0 :(得分:7)

对于您所处的and,他们会给您相同的结果。至于风格,选择更能表达你意图的风格。

但是,只要您开始使用position()count()first()last()等位置功能,就会发挥作用。

亲眼看看:

/Products/Product[Manufacturer/@country = 'UK' and (position() = 1)]
如果列表中的第一个产品不是来自英国,

不会返回任何节点,而:

/Products/Product[Manufacturer/@country = 'UK'][position() = 1]

将返回与UK匹配的第一个节点作为国家/地区,也可以以简短形式写入:

/Products/Product[Manufacturer/@country = 'UK'][1]

答案 1 :(得分:5)

它们之间的区别是:

  • 第一个变体(… and …)是单个谓词;它必须作为一个整体来实现
  • 第二个变体(…][…)是多个谓词;他们一个接一个地进行评估

只要您使用连词(逻辑“和”)将条件联系在一起,结果就是一样的。后者无法实现分离(逻辑“或”)。

另请注意,多个谓词按其定义的顺序进行处理,因此

/Products/Product[Manufacturer/@country = 'UK'][2]

表示“在英国制造的第二个产品”,而

/Products/Product[Manufacturer/@country = 'UK' and position() = 2]

表示“列表中的第二个产品,但仅限于在英国生产”

答案 2 :(得分:2)

XmlVisualizer(仅适用于Windows / .NET)工具可以方便地显示xpath结果,或者用xpath进行黑客攻击:

alt text

免费&amp;开源。

答案 3 :(得分:1)

虽然内部处理方式可能略有不同,但两种陈述之间没有区别。同样地,对于是否一个在另一个上没有性能上的好处或建议。

我个人更喜欢第一个(and),因为它更容易分辨出发生了什么,特别是当你添加更复杂的比较时( s和或 s)混合。