如何保证XPath“OR”查询的节点顺序

时间:2010-12-21 09:49:21

标签: .net xml xpath

我有一段看起来像

的XML片段
<body>
   Some text....
   <nodeA>....</nodeA>
   more text
   <someOtherNode>
      <nodeA>.......</nodeA>
   </someOtherNode>
   <nodeB>.......</nodeB>  
   etc.....
</body>

我正在使用类似的XPATH查询选择<body>内的所有nodeA和NodeB节点 //nodeA|//nodeB

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

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

nodeA, nodeA, nodeB   

2 个答案:

答案 0 :(得分:4)

  

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

当评估选择节点的XPath 1.0表达式时,所选节点形成节点集节点集是一个集合,这在许多其他方面意味着它是无序的

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

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

请注意:无法保证以下顺序,并且与实现有关:

  1. 同一元素的属性。

  2. 属于不同文档的节点(包含来自不同文档的节点的节点集可以使用XSLT函数document()生成,所以这很可能与您无关)。

答案 1 :(得分:0)

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

或者使用.NET的XPath 2.0实现