Использование Html Agility Pack, выбор текущего элемента в цикле (XPATH)

.net c# html html-agility-pack xpath

Вопрос

Я пытаюсь сделать что-то простое, но почему-то это не работает для меня, вот мой код:

var items = html.DocumentNode.SelectNodes("//div[@class='itembox']");
foreach(HtmlNode e in items)
{

     int x = items.count; // equals 10
     HtmlNode node = e;
     var test = e.SelectNodes("//a[@class='head']");// I need this to return the 
                                                // anchor of the current itembox 
                                                // but instead it returns the
                                                // anchor of each itembox element
     int y =test.count; //also equals 10!! suppose to be only 1
}

моя страница html выглядит так:

....
<div class="itembox">
    <a Class="head" href="one.com">One</a>
</div>
<div class="itembox">
    <a Class="head" href="two.com">Two</a>
</div>
<!-- 10 itembox elements-->
....

Является ли мое выражение XPath неправильным? я что-то упускаю?

Принятый ответ

использование

var test = e.SelectNodes(".//a[@class='head']");

вместо. Ваш текущий код ( //a[] ) выполняет поиск всех элементов, начиная с корневого узла. Если вы вместо этого .//a[] его точкой ( .//a[] ), будут учитываться только потомки текущего узла. Так как это прямой ребенок в вашем случае, вы, конечно же, можете:

var test = e.SelectNodes("a[@class='head']");

Как всегда, посмотрите спецификацию Xpath .


Популярные ответы

 var test = e.SelectNodes("//a[@class='head']");

Это абсолютное выражение, но вам нужно относительное выражение XPath - для оценки с e .

Поэтому используйте :

 var test = e.SelectNodes("a[@class='head']");

Заметьте: избегайте использования псевдо-оператора XPath // как можно больше, потому что такое использование может привести к значительной неэффективности (замедление).

В данном документе XML - a элементы только дети div - не на undefinite глубине от div .



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему