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