我有一段看起来像
的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
答案 0 :(得分:4)
据我所知,.NET支持 XPath 1.0不保证 节点顺序
当评估选择节点的XPath 1.0表达式时,所选节点形成节点集。 节点集是一个集合,这在许多其他方面意味着它是无序的。
但是,出于实际目的,选择了一个主要排序来枚举节点集的节点:文档顺序。实际上,我所知道的所有XPath 1.0引擎(当然在.NET中)都按文档顺序返回所选节点。在未来,这不太可能改变,因为供应商试图保持向后兼容性。
因此,只需尝试使用SelectNodes()
或Evaluate()
方法,并验证结果中的节点是否按文档顺序。
请注意:无法保证以下顺序,并且与实现有关:
同一元素的属性。
属于不同文档的节点(包含来自不同文档的节点的节点集可以使用XSLT函数document()
生成,所以这很可能与您无关)。
答案 1 :(得分:0)
您必须对XPath之外的节点进行排序。因此,遍历节点集中的节点并将它们添加到集合中,然后使用XPathNavigator.ComparePosition
对其进行排序以进行比较。
或者使用.NET的XPath 2.0实现