Html Agility Pack循環遍歷表行和列


我有一張這樣的桌子

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

並希望使用HTML Agility Pack來解析它。我試過這段代碼無濟於事:

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

我究竟做錯了什麼?

一般承認的答案

我必須提供完整的xpath。我從@Coda( https://stackoverflow.com/a/3104048/1238850 )的建議中使用Firebug得到了完整的xpath,我最終得到了這段代碼:

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

我相信它可以寫得比這更好,但它現在對我有用。


熱門答案

我運行代碼並且它只顯示名稱 ,這是正確的,因為Ages是使用無效的HTML定義的: <th></td> (可能是拼寫錯誤)。

順便說一句,代碼可以簡化為只有一個循環:

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

這是我以前測試的代碼: http//pastebin.com/euzhUAAh





許可下: CC-BY-SA
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因