Странное поведение XMLNodeList

Возьмите следующий XML в качестве примера:

<root>
  <lines>
    <line>
      <number>1</number>
    </line>
    <line>
      <number>2</number>
    </line>
  </lines>
</root>

XmlNodeList nodeList = doc.SelectNodes("//lines/line");
foreach(XmlNode node in nodeList)
{
    int index = node.SelectSingleNode("//number");
}

Приведенный выше код приведет к индексу = 1 для обеих итераций.

foreach(XmlNode node in nodeList)
{
    int index = node.SelectSingleNode("number");
}

Приведенный выше код даст 1,2 соответственно. Я знаю, что // находит первое вхождение xpath, но мне кажется, что первое вхождение должно быть относительно самого узла. Похоже, что поведение находит первое вхождение от корня даже при выборе узлов из дочернего узла. Это так задумано Майкрософт или это ошибка?


person Maxqueue    schedule 18.02.2016    source источник
comment
Попробуйте .//number. Это должно сделать поиск из узла контекста. // предназначен для поиска всего документа, а не контекста.   -  person Lingamurthy CS    schedule 19.02.2016
comment
да, спасибо, но просто удаление косой черты сработало так же, как и во втором примере. Я просто думаю, что это сбивает с толку, что если вы ищете узел внутри узла, который // будет возвращаться ко всему документу.   -  person Maxqueue    schedule 19.02.2016


Ответы (1)


да, спасибо, но просто удаление косой черты сработало так же, как и во втором примере.

Удаление косых черт работает только потому, что number является непосредственным дочерним элементом line. Если бы он был ниже в иерархии:

<root>
  <lines>
    <line>
      <other>
        <number>1</number>
      </other>
    </line>
  </lines>
</root>

вам все равно нужно будет использовать .//number.

Я просто думаю, что это сбивает с толку, что если вы ищете узел внутри узла, который // будет возвращаться ко всему документу.

Именно так устроен синтаксис XPath. // в начале выражения XPath означает, что контекстом оценки является узел документа — самый внешний узел XML-документа. .// означает, что контекстом выражения пути является текущий узел контекста.

Если подумать, на самом деле полезно иметь возможность выбирать из всего документа в любом контексте.

Это так задумано Майкрософт или это ошибка?

Microsoft реализует стандарт XPath, и да, именно так W3C намеревался работать с библиотекой XPath, и это не ошибка.

person Mathias Müller    schedule 19.02.2016