Html Agility Pack將表解析為對象

c# foreach html-agility-pack html-parsing

所以我有這樣的HTML:

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

對於每個客戶行,它會繼續這樣。我想將每個表行的內容解析為一個對象。我嘗試了很少的方法,但我似乎無法正常工作。

這就是我目前所擁有的

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

它的工作原理是它在每個循環上打印表格最後一行的信息。我只是錯過了一些非常簡單但卻看不清楚的東西。

我的創建對象的方式也很好,或者我應該使用構造函數並從變量創建對象?例如

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

熱門答案

您的XPath查詢是錯誤的。您需要使用td而不是//td

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

//td傳遞給SelectNodes()將匹配文檔中的所有 <td>元素,因此內部循環運行8次而不是4次,最後4次始終覆蓋先前在Customer像中設置的值。

請參閱XPath示例



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow