HtmlAgilityPack e selezionando Nodi e Sottonodi

c# html-agility-pack xpath

Domanda

Spero che qualcuno possa aiutarmi.

Diciamo che ho un documento html che contiene più div come questo esempio:

<div class="search_hit">

    <span prop="name">Richard Winchester</span>
    <span prop="company">Kodak</span>
    <span prop="street">Arlington Road 1</span>

</div>
<div class="search_hit">

    <span prop="name">Ted Mosby</span>
    <span prop="company">HP</span>
    <span prop="street">Arlington Road 2</span>

</div>

Sto usando HtmlAgilityPack per ottenere il documento html. Quello che ho bisogno di sapere è come posso ottenere gli span per ogni "search_hit" -div?

Il mio primo pensiero è stato qualcosa del genere:

<div class="search_hit">

    <span prop="name">Richard Winchester</span>
    <span prop="company">Kodak</span>
    <span prop="street">Arlington Road 1</span>

</div>
<div class="search_hit">

    <span prop="name">Ted Mosby</span>
    <span prop="company">HP</span>
    <span prop="street">Arlington Road 2</span>

</div>

Ogni div dovrebbe essere un oggetto con gli span inclusi come proprietà. I. e.

<div class="search_hit">

    <span prop="name">Richard Winchester</span>
    <span prop="company">Kodak</span>
    <span prop="street">Arlington Road 1</span>

</div>
<div class="search_hit">

    <span prop="name">Ted Mosby</span>
    <span prop="company">HP</span>
    <span prop="street">Arlington Road 2</span>

</div>

E questo elenco sarà riempito allora:

<div class="search_hit">

    <span prop="name">Richard Winchester</span>
    <span prop="company">Kodak</span>
    <span prop="street">Arlington Road 1</span>

</div>
<div class="search_hit">

    <span prop="name">Ted Mosby</span>
    <span prop="company">HP</span>
    <span prop="street">Arlington Road 2</span>

</div>

Ma l'XPATH che sto usando non sta facendo una ricerca nel sottonodo come dovrebbe. Sembra che ricerchi l'intero documento ancora e ancora.

Voglio dire, l'ho già fatto funzionare in questo modo che ho ottenuto solo gli span dell'intera pagina. Ma poi non ho alcuna relazione tra gli span e le div. Mezzi: non so più quale intervallo è correlato a quale div.

Qualcuno conosce una soluzione? Ho già giocato in giro così tanto che ora sono totalmente confuso :)

Qualsiasi aiuto è apprezzato!

Risposta accettata

Il seguente funziona per me. Il bit importante è proprio come BeniBela ha notato di aggiungere un punto in seconda chiamata a "SelectNodes".

List<Record> lstRecords=new List<Record>();
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//div[@class='search_hit']"))
{
  Record record=new Record();
  foreach (HtmlNode node2 in node.SelectNodes(".//span[@prop]"))
  {
    string attributeValue = node2.GetAttributeValue("prop", "");
    if (attributeValue == "name")
    {
      record.Name = node2.InnerText;
    }
    else if (attributeValue == "company")
    {
      record.company = node2.InnerText;
    }
    else if (attributeValue == "street")
    {
      record.street = node2.InnerText;
    }
  }
  lstRecords.Add(record);
}

Risposta popolare

Se si utilizza // , viene avviata la ricerca dal documento.

Usa .// per cercare tutto dal nodo corrente

 foreach (HtmlAgilityPack.HtmlNode node2 in node.SelectNodes(".//span[@prop]"))

Oppure rilasciare il prefisso interamente per cercare solo i bambini diretti:

 foreach (HtmlAgilityPack.HtmlNode node2 in node.SelectNodes(".//span[@prop]"))



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é