Как гарантировать порядок узлов для запроса XPath «ИЛИ»? - PullRequest
2 голосов
/ 21 декабря 2010

У меня есть фрагмент XML, который выглядит как

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

Я выбираю все узлы nodeA и NodeB внутри <body>, используя запрос XPATH, аналогичный //nodeA|//nodeB

AsЯ понимаю, что .NET поддерживает XPath 1.0, который не гарантирует порядок узлов.

Как я могу гарантировать, что выбранные узлы возвращаются в порядке документа в моем запросе OR: это означает:

nodeA, nodeA, nodeB   

Ответы [ 2 ]

4 голосов
/ 21 декабря 2010

Насколько я понимаю, .NET поддерживает XPath 1.0, который не гарантирует порядок узлов

Когда вычисляется выражение XPath 1.0, которое выбирает узлы, выбранные узлы образуют набор узлов . Набор узлов - это набор, и это, помимо прочего, означает, что он неупорядочен .

Для практических целей, однако, существует один основной порядок , выбранный для перечисления узлов набора узлов: порядок документов. На практике все известные мне движки XPath 1.0 (и, конечно, в .NET) возвращают выбранные узлы в порядке документа. В будущем это вряд ли изменится, потому что поставщики пытаются сохранить обратную совместимость.

Поэтому просто попробуйте использовать методы SelectNodes() или Evaluate() и убедитесь, что узлы в результатах расположены в порядке документов .

Примечание : Порядок следующего не может быть гарантирован и зависит от реализации:

  1. Атрибуты одного и того же элемента.

  2. Узлы, принадлежащие разным документам (набор узлов, содержащий узлы из разных документов, может быть создан с использованием функции XSLT document(), так что это, скорее всего, вас не касается).

0 голосов
/ 21 декабря 2010

Вы должны отсортировать узлы вне XPath. Так что итерируйте узлы в наборе узлов и добавьте их в коллекцию, которую вы затем сортируете, используя XPathNavigator.ComparePosition для сравнения.

Либо так, либо используйте реализацию XPath 2.0 для .NET

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...