Html Agility Pack boucle à travers les lignes et les colonnes de tableau

.net c# html-agility-pack

Question

J'ai une table comme ça

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

Et souhaitez utiliser HTML Agility Pack pour l’analyser. J'ai essayé ce code en vain:

<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'est-ce que je fais mal?

Réponse acceptée

Je devais fournir le xpath complet. J'ai obtenu le xpath complet en utilisant Firebug à partir d'une suggestion de @Coda ( https://stackoverflow.com/a/3104048/1238850 ) et j'ai obtenu ce code:

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

Je suis sûr que ça peut être écrit mieux que ça, mais ça marche pour moi maintenant.


Réponse populaire

J'ai exécuté le code et il affiche uniquement les noms , ce qui est correct, car les âges sont définis avec un code HTML non valide: <th></td> (probablement une faute de frappe).

À propos, le code peut être simplifié en une seule boucle:

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

Voici le code que j'ai utilisé pour tester: http://pastebin.com/euzhUAAh




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi