Сведения о вопросе

Ислам

01:13, 7th August, 2020

Теги

.net   xpath    

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

Просмотров: 431   Ответов: 4

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

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

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

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



  Сведения об ответе

davran

09:19, 14th August, 2020

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

Так что у вас есть:

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

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

xmlNode stuffChild = хлам.SelectSingleNode("self::node()/descendant::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 содержит полезную информацию в удобном для усвоения формате.


  Сведения об ответе

lool

15:49, 25th August, 2020

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

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

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


  Сведения об ответе

ITSME

12:47, 6th August, 2020

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

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


  Сведения об ответе

прога

09:55, 22nd August, 2020

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

XmlNode stuffChild = stuff.SelectSingleNode("descendant::stuffChild[1]");


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться