Html敏捷包解析表到对象

本文关键字:对象 包解析 Html | 更新日期: 2023-09-27 18:12:14

所以我有这样的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);

Html敏捷包解析表到对象

您的XPath查询错误。您需要使用td而不是//td:

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

//td传递给SelectNodes()将匹配文档中的所有 <td>元素,因此您的内部循环运行8次而不是4次,最后4次总是覆盖以前在Customer对象中设置的值。

参见XPath示例