Bucle del paquete de agilidad de HTML a través de filas y columnas de la tabla

.net c# html-agility-pack

Pregunta

Tengo una mesa como esta

<table border="0" cellpadding="0" cellspacing="0" id="table2">
    <tr>
        <th>Name
        </th>
        <th>Age
        </th>
    </tr>
        <tr>
        <td>Mario
        </td>
        <th>Age: 78
        </td>
    </tr>
            <tr>
        <td>Jane
        </td>
        <td>Age: 67
        </td>
    </tr>
            <tr>
        <td>James
        </td>
        <th>Age: 92
        </td>
    </tr>
</table>

Y quiere usar HTML Agility Pack para analizarlo. He intentado este código en vano:

<table border="0" cellpadding="0" cellspacing="0" id="table2">
    <tr>
        <th>Name
        </th>
        <th>Age
        </th>
    </tr>
        <tr>
        <td>Mario
        </td>
        <th>Age: 78
        </td>
    </tr>
            <tr>
        <td>Jane
        </td>
        <td>Age: 67
        </td>
    </tr>
            <tr>
        <td>James
        </td>
        <th>Age: 92
        </td>
    </tr>
</table>

¿Qué estoy haciendo mal?

Respuesta aceptada

Tuve que proporcionar el xpath completo. Obtuve el xpath completo usando Firebug de una sugerencia de @Coda ( https://stackoverflow.com/a/3104048/1238850 ) y terminé con este código:

foreach (HtmlNode row in doc.DocumentNode.SelectNodes("/html/body/table/tbody/tr/td/table[@id='table2']/tbody/tr"))
{
    HtmlNodeCollection cells = row.SelectNodes("td");
    for (int i = 0; i < cells.Count; ++i)
    {
        if (i == 0)
        { Response.Write("Person Name : " + cells[i].InnerText + "<br>"); }
        else {
            Response.Write("Other attributes are: " + cells[i].InnerText + "<br>"); 
        }
    }
}

Estoy seguro de que se puede escribir mucho mejor que esto, pero ahora está funcionando para mí.


Respuesta popular

He ejecutado el código y muestra solo los Nombres , lo cual es correcto, porque las Edades se definen utilizando un HTML no válido: <th></td> (probablemente un error tipográfico).

Por cierto, el código se puede simplificar a un solo bucle:

foreach (var cell in doc.DocumentNode.SelectNodes("//table[@id='table2']/tr/td"))
{
    Response.Write(cell.InnerText);
}

Aquí está el código que solía probar: http://pastebin.com/euzhUAAh




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é