XPath и выбор одного узла - PullRequest
       28

XPath и выбор одного узла

11 голосов
/ 26 августа 2008

Я использую XPath в .NET для разбора XML-документа, например:

XmlNodeList lotsOStuff = doc.SelectNodes("//stuff");

foreach (XmlNode stuff in lotsOStuff) {
   XmlNode stuffChild = stuff.SelectSingleNode("//stuffChild");
   // ... etc
}

Проблема в том, что запрос XPath для stuffChild всегда возвращает дочерний элемент первого элемента stuff, а не остальных. Разве XPath не может быть использован для запроса к человеку XMLElement?

Ответы [ 4 ]

10 голосов
/ 26 августа 2008

// в начале выражения XPath начинается с корня документа. Попробуйте ".//stuffChild". , сокращение для self :: node (), которое устанавливает контекст для поиска, а // сокращение для оси-потомка.

Итак, у вас есть:

XmlNode stuffChild = stuff.SelectSingleNode(".//stuffChild");

, что переводится как:

xmlNode stuffChild = stuff.SelectSingleNode ("self :: node () / Потомок :: stuffChild");

xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant-or-self::stuffChild");

В случае, когда дочерний узел может иметь то же имя, что и родительский, вы можете использовать чуть более подробный синтаксис, который следует ниже, чтобы гарантировать, что вы не выберете родительский узел:

xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant::stuffChild");

Также обратите внимание, что если "stuffChild" является прямым потомком "stuff", вы можете полностью пропустить префиксы и просто выбрать "stuffChild".

XmlNode stuffChild = stuff.SelectSingleNode("stuffChild");

В учебнике W3Schools содержится полезная информация в удобном для восприятия формате.

2 голосов
/ 26 августа 2008

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

Если вы хотите начать с текущего узла (потомков текущего узла), вы должны использовать .//, как в:

stuff.SelectSingleNode(".//stuffChild");
1 голос
/ 26 августа 2008

Если "stuffChild" является дочерним узлом "вещи", то ваш xpath должен быть просто:

XmlNode stuffChild = stuff.SelectSingleNode("stuffChild");
0 голосов
/ 27 февраля 2009

Выбор одного узла означает, что вам нужен только первый элемент. Итак, лучшее решение:

XmlNode stuffChild = stuff.SelectSingleNode("descendant::stuffChild[1]");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...