Utilisation de HTML Agility Pack, sélection de l'élément actuel dans une boucle (XPATH)

.net c# html html-agility-pack xpath

Question

J'essaie de faire quelque chose de simple, mais de toute façon cela ne fonctionne pas pour moi, voici mon code:

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
}

ma page html ressemble à ceci:

....
<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-->
....

Est-ce que mon expression XPath est fausse? est-ce que je manque quelque chose?

Réponse acceptée

Utilisation

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

au lieu. Votre code actuel ( //a[] ) recherche dans tous les éléments en partant du nœud racine. Si vous .//a[] par un point ( .//a[] ), seuls les descendants du nœud actuel seront pris en compte. Dans la mesure où il s’agit d’un enfant direct dans votre cas, vous pouvez bien entendu également:

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

Comme toujours, consultez la spécification Xpath pour plus de détails.


Réponse populaire

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

C'est une expression absolue, mais vous avez besoin d'une expression relative XPath - à évaluer hors e .

Par conséquent, utilisez :

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

Remarque: évitez autant que possible d'utiliser le pseudo-opérateur XPath // , car une telle utilisation peut entraîner des inefficacités importantes (ralentissement).

Dans ce document XML en particulier les a des éléments ne sont que des enfants de div - pas en profondeur indéfinis hors div .



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi