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