Html Agility Pack analysiert Tabelle in Objekt

c# foreach html-agility-pack html-parsing

Frage

Also habe ich HTML so:

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

Und so geht es für jede Kundenreihe weiter. Ich möchte Inhalte jeder Tabellenzeile zu einem Objekt analysieren. Ich habe einige Methoden ausprobiert, aber ich kann nicht scheinen, dass es richtig funktioniert.

Das habe ich zur Zeit

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

Es funktioniert bis zu dem Punkt, dass es Informationen der letzten Reihe der Tabelle auf jeder Schleife druckt. Ich vermisse nur etwas sehr einfaches, kann aber nicht sehen was.

Auch ist meine Art, das Objekt gut zu erstellen, oder sollte ich einen Konstruktor verwenden und das Objekt aus Variablen erstellen? Z.B

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

Beliebte Antwort

Ihre XPath-Abfrage ist falsch. Sie müssen td anstelle von //td :

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

Wenn Sie //td an SelectNodes() werden alle <td> -Elemente im Dokument SelectNodes() Daher wird Ihre innere Schleife acht Mal anstelle von vier Mal ausgeführt, und die letzten vier Male überschreiben immer die zuvor in Ihrem Customer Objekt festgelegten Werte.

Siehe XPath-Beispiele



Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow