Utilizzo di Html Agility Pack, Selezione dell'elemento corrente in un ciclo (XPATH)

.net c# html html-agility-pack xpath

Domanda

Sto cercando di fare qualcosa di semplice, ma in qualche modo non funziona per me, ecco il mio codice:

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
}

la mia pagina html ha il seguente aspetto:

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
}

La mia espressione XPath è sbagliata? mi sto perdendo qualcosa?

Risposta accettata

Uso

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

anziché. Il tuo codice corrente ( //a[] ) cerca tutti gli elementi a partire dal nodo radice. Se invece lo si .//a[] con un punto ( .//a[] ), verranno considerati solo i discendenti del nodo corrente. Dal momento che è un bambino diretto nel tuo caso, potresti anche fare:

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

Come sempre, vedi le specifiche di Xpath per i dettagli.


Risposta popolare

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

Questa è un'espressione assoluta, ma hai bisogno di un'espressione XPath relativa - da valutare fuori e .

Quindi usare :

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

Nota: evitare il più possibile l'utilizzo dello pseudo-operatore XPath // , poiché tale utilizzo può causare inefficienze significative (rallentamenti).

In questo particolare documento XML gli a elementi sono solo figli di div - non a non definite di profondità al largo div .




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché