Html Agility Pack che analizza la tabella in oggetto

c# foreach html-agility-pack html-parsing

Domanda

Quindi ho HTML come questo:

<tr class="row1">
        <td class="id">123</td>
        <td class="date">2014-08-08</td>
        <td class="time">12:31:25</td>
        <td class="notes">something here</td>
</tr>
<tr class="row0">
        <td class="id">432</td>
        <td class="date">2015-02-09</td>
        <td class="time">12:22:21</td>
        <td class="notes">something here</td>
</tr>

E continua così per ogni riga del cliente. Voglio analizzare il contenuto di ogni riga della tabella in un oggetto. Ho provato alcuni metodi ma non riesco a farlo funzionare correttamente.

Questo è quello che ho attualmente

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
foreach (HtmlNode row in doc.DocumentNode.SelectNodes("//table[@id='customerlist']//tr"))
{
    Customer cust = new Customer();
    foreach (HtmlNode info in row.SelectNodes("//td"))
    {
        if (info.GetAttributeValue("class", String.Empty) == "id")
        {
            cust.ID = info.InnerText;
        }
        if (info.GetAttributeValue("class", String.Empty) == "date")
        {
            cust.DateAdded = info.InnerText;
        }
        if (info.GetAttributeValue("class", String.Empty) == "time")
        {
            cust.TimeAdded = info.InnerText;
        }
        if (info.GetAttributeValue("class", String.Empty) == "notes")
        {
            cust.Notes = info.InnerText;
        }
    }
    Console.WriteLine(cust.ID + " " + cust.TimeAdded + " " + cust.DateAdded + " " + cust.Notes);
}

Funziona al punto che stampa le informazioni dell'ultima riga della tabella su ciascun ciclo. Mi manca solo qualcosa di molto semplice ma non riesco a vedere cosa.

È anche il mio modo di creare l'oggetto fine, o dovrei usare un costruttore e creare l'oggetto dalle variabili? Per esempio

    string Notes = String.Empty;
if (info.GetAttributeValue("class", String.Empty) == "notes")
{
    Notes = info.InnerText;
}
..
Customer cust = new Customer(id, other_variables, Notes, etc);

Risposta popolare

La tua query XPath è sbagliata. Devi usare td invece di //td :

foreach (HtmlNode info in row.SelectNodes("td"))

Passando //td a SelectNodes() corrisponderà a tutti gli elementi <td> nel documento, quindi il tuo ciclo interno viene eseguito 8 volte anziché 4 volte e le ultime 4 volte sostituiscono sempre i valori precedentemente impostati nell'oggetto Customer .

Vedi esempi XPath



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é