XPath SelectNodes в .NET - PullRequest
       13

XPath SelectNodes в .NET

16 голосов
/ 18 февраля 2009
<Document>
  <A> 
    <B> 
      <C></C>
    </B>
  </A>
  <E>
   <F>
    <C></C>
   </F>
   <G>
    <C></C>
  </G>
 </E>
</Document>

Если я загружаю вышеуказанный XML-код в XmlDocument и выполняю SelectSingleNode на A, используя запрос XPath // C

XmlNode oNode = oDocument.SelectSingleNode("E");
XmlNodeList oNodeList = oNode.SelectNodes("//C");

почему он возвращает узлы из-под B, когда то, что я ожидал, будет возвращать узлы из-под E

Имеет смысл?

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

Ответы [ 4 ]

27 голосов
/ 18 февраля 2009

Просто: ведущий // означает «на любом уровне» в том же документе , что и выбранный узел.

Из спецификации :

  • // para выбирает все para-потомки корневого элемента документа и, таким образом, выбирает все элементы para в том же документе, что и контекстный узел
  • . // para выбирает потомков элемента para узла контекста
11 голосов
/ 18 февраля 2009

Указание .//C приведет к тому, что вы хотите, в противном случае XPath начинается с корня документа, а не с текущего узла.

Путаница в определении // из стандарта XPath выглядит следующим образом:

// это сокращение от / Потомок или сам-:: узел () /. За Например, // para это сокращение от / Потомок или-я :: узел () / ребенок :: пункт и поэтому выберет любой элемент в документ (даже элемент para, который будет выбран элемент документа // para, так как элемент документа узел является дочерним по отношению к корневому узлу); div // para - это сокращение от DIV / потомок или-я :: узел () / ребенок :: пункт и так выберу все пункты потомки детей div.

Поскольку // является сокращением от /descendant-or-self::node()/, оно начинается на уровне документа, если вы не указали узел в начале.

6 голосов
/ 18 февраля 2009

//C - это все узлы C во всем документе

/E//C будет только узлами C под E

/C будет только корневым узлом C

См. Справочник по синтаксису xpath

3 голосов
/ 18 февраля 2009

В спецификации XPATH вы найдете под 2.5 следующее утверждение:

// para выбирает все параметры потомки корня документа и таким образом выбирает все элементы para в тот же документ, что и контекстный узел

т.е. поведение, которое вы наблюдаете, является действительным. Вы должны сделать что-то вроде "/ E // C"

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