Tabla de análisis de paquete de agilidad de HTML en objeto

c# foreach html-agility-pack html-parsing

Pregunta

Así que tengo HTML como este:

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

Y continúa así para cada fila de clientes. Quiero analizar el contenido de cada fila de la tabla a un objeto. He intentado algunos métodos pero parece que no puedo hacerlo funcionar bien.

Esto es lo que tengo actualmente.

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);
}

Funciona hasta el punto de que imprime información de la última fila de la tabla en cada bucle. Solo me falta algo muy simple pero no puedo ver qué.

¿También mi forma de crear el objeto está bien, o debo usar un constructor y crear el objeto a partir de variables? P.ej

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

Respuesta popular

Su consulta XPath es incorrecta. Necesitas usar td lugar de //td :

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

Pasar //td a SelectNodes() coincidirá con todos los elementos <td> del documento, por lo tanto, su bucle interno se ejecuta 8 veces en lugar de 4 veces, y las últimas 4 veces siempre anulan los valores establecidos previamente en su objeto Customer .

Ver ejemplos de XPath



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué