2016-02-18 4 views
0

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

<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, но я чувствую, что первое вхождение должно относиться к самому узлу. Похоже, что поведение обнаруживает первое появление из корня даже при выборе узлов из дочернего узла. Это то, как Microsoft планировала это работать или это ошибка.

+2

Попробуйте '.// номер'. Предполагается, что поиск выполняется из контекстного узла. '//' предназначен для всего поиска документа, а не для контекста. –

+0

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

ответ

2

Да, спасибо, но просто удалили сляки, как и в моем втором примере.

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

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

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

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

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

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

Так ли это должно было работать в Microsoft, или это ошибка.

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

+0

Спасибо, что это очистило меня – Maxqueue