Usando Html Agility Pack, seleccionando el elemento actual en un bucle (XPATH)

.net c# html html-agility-pack xpath

Pregunta

Estoy tratando de hacer algo simple, pero de alguna manera no me funciona, aquí está mi código:

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
}

mi página html se ve así:

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

¿Es mi expresión XPath incorrecta? ¿Me estoy perdiendo de algo?

Respuesta aceptada

Utilizar

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

en lugar. Su código actual ( //a[] ) busca todos los elementos a partir del nodo raíz. Si lo .//a[] con un punto ( .//a[] ) solo se considerarán los descendientes del nodo actual. Como es un niño directo en tu caso, por supuesto, también podrías:

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

Como siempre ver la especificación Xpath para más detalles.


Respuesta popular

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

Esta es una expresión absoluta, pero necesita una expresión XPath relativa: para ser evaluada fuera de e .

Por lo tanto usar :

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

Tenga en cuenta: Evite utilizar el pseudooperador XPath // tanto como sea posible, ya que dicho uso puede provocar importantes ineficiencias (ralentización).

En este documento XML en particular los a elementos son sólo los niños de div - no en undefinite de profundidad frente div .



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow