【问题标题】:How do I guarantee node order for an XPath 'OR' query如何保证 XPath 'OR' 查询的节点顺序
【发布时间】:2010-12-22 02:23:36
【问题描述】:

我有一个 XML 的 sn-p,看起来像

<body>
   Some text....
   <nodeA>....</nodeA>
   more text
   <someOtherNode>
      <nodeA>.......</nodeA>
   </someOtherNode>
   <nodeB>.......</nodeB>  
   etc.....
</body>

我正在使用类似于 //nodeA|//nodeB

据我了解,.NET 支持不保证节点顺序的 XPath 1.0。

如何保证在我的 OR 查询中按文档顺序返回所选节点:也就是说:

nodeA, nodeA, nodeB   

【问题讨论】:

    标签: .net xml xpath


    【解决方案1】:

    据我了解,.NET 支持 XPath 1.0 不保证 节点顺序

    当一个选择节点的 XPath 1.0 表达式被求值时,被选择的节点形成一个 node-set节点集是一个集合,这意味着它是无序的

    不过,出于实际目的,选择了一种主要的顺序来枚举节点集的节点:文档顺序。在实践中,我所知道的所有 XPath 1.0 引擎(当然在 .NET 中)都按文档顺序返回选定的节点。将来这不太可能改变,因为供应商试图保持向后兼容性。

    因此,只需尝试使用SelectNodes()Evaluate() 方法并验证结果中的节点是否按文档顺序排列

    注意:以下顺序无法保证,具体取决于实现:

    1. 同一元素的属性。

    2. 属于不同文档的节点(可以使用 XSLT 函数document() 生成一个包含来自不同文档的节点的节点集,因此您很可能不关心)。

      李>

    【讨论】:

    • 我也是这么理解的,但是我还没有找到一个官方参考来证实.NET在存在OR( union) XPath 中的运算符
    • @Tom-Carter:联合表达式(顺便说一句,这与使用 or 运算符的布尔表达式不同)只是一个普通的 XPath 表达式。为什么只为联合表达式需要单独的节点顺序语句?
    【解决方案2】:

    您必须对 XPath 之外的节点进行排序。因此,遍历节点集中的节点并将它们添加到集合中,然后使用XPathNavigator.ComparePosition 对其进行排序以进行比较。

    或者使用 .NET 的 XPath 2.0 实现

    【讨论】:

      猜你喜欢
      • 2011-04-14
      • 1970-01-01
      • 2018-02-06
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      相关资源
      最近更新 更多