Использование Html Agility Pack, Выбор текущего элемента в цикле (XPATH) - PullRequest
1 голос
/ 15 января 2012

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

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 неверно?я что-то упустил?

Ответы [ 2 ]

5 голосов
/ 15 января 2012

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

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

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

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

Как всегда, см. Xpath spec для деталей.

0 голосов
/ 15 января 2012
 var test = e.SelectNodes("//a[@class='head']");

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

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

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

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

В этом конкретном XML-документе элементы a являются просто потомками div, а не на неопределенной глубине от div.

...