代码之家  ›  专栏  ›  技术社区  ›  AakashM

这两种类型的xpath逻辑“和”等价吗?

  •  3
  • AakashM  · 技术社区  · 15 年前

    假设我有这样的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')]
    

    两个都能找到我想要的节点。

    我的问题是,这两种方法和ED条件之间有什么功能上的区别吗?是否存在不同方法可能产生不同结果的情况?(我意识到 and 在更复杂的条件下服务)在风格上,一个比另一个更好吗?

    (我使用的是C和.NET 2.0,但我认为这与答案没有任何关系)

    4 回复  |  直到 9 年前
        1
  •  7
  •   Lucero    15 年前

    为了 and 在你的情况下,他们给你同样的结果。至于风格,选择更能表达你意图的风格。

    但是,一旦开始使用位置函数,例如 position() , count() , first() last() 这确实有区别。

    自己看看:

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

    如果列表中的第一个产品不是来自英国,则不返回任何节点,同时:

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

    将返回与英国匹配的第一个节点作为国家,也可以用短格式编写:

    /Products/Product[Manufacturer/@country = 'UK'][1]
    
        2
  •  5
  •   Tomalak    9 年前

    两者的区别在于:

    • 第一种变体( … and … )是单个谓词;必须作为一个整体完成
    • 第二种变体( …][… )是多个谓词;它们被逐个计算

    只要使用连词(逻辑“and”)将条件连接在一起,结果就相同。分离(逻辑“或”)不能与后者一起实现。

    还要注意,多个谓词按定义的顺序进行处理,因此

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

    方法 “英国制造的第二种产品” ,同时

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

    方法 “列表中的第二个产品,但仅当它在英国制造时” .

        3
  •  2
  •   Cheeso    15 年前

    这个 XmlVisualizer (仅适用于windows/.net)工具对于可视化xpath结果或利用xpath进行黑客攻击非常方便:

    alt text http://i50.tinypic.com/6i7mog.jpg

    免费&开源。

        4
  •  1
  •   Richard Szalay    15 年前

    虽然在内部处理它们的方式上可能有细微的差别,但是您的两个语句之间没有差别。同样,没有绩效效益,也没有对是否一个比另一个更好的建议。

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