Ich habe einen Tisch wie diesen
<table border="0" cellpadding="0" cellspacing="0" id="table2">
<tr>
<th>Name
</th>
<th>Age
</th>
</tr>
<tr>
<td>Mario
</td>
<th>Age: 78
</td>
</tr>
<tr>
<td>Jane
</td>
<td>Age: 67
</td>
</tr>
<tr>
<td>James
</td>
<th>Age: 92
</td>
</tr>
</table>
Und möchte HTML Agility Pack verwenden, um es zu analysieren. Ich habe diesen Code vergebens ausprobiert:
foreach (HtmlNode row in doc.DocumentNode.SelectNodes("//table[@id='table2']//tr"))
{
foreach (HtmlNode col in row.SelectNodes("//td"))
{
Response.Write(col.InnerText);
}
}
Was mache ich falsch?
Ich musste den vollständigen XPath bereitstellen. Ich habe den vollständigen XPath mit Firebug von einem Vorschlag von @Coda ( https://StackOverflow.com/a/3104048/1238850 ) bekommen und ich endete mit diesem Code:
foreach (HtmlNode row in doc.DocumentNode.SelectNodes("/html/body/table/tbody/tr/td/table[@id='table2']/tbody/tr"))
{
HtmlNodeCollection cells = row.SelectNodes("td");
for (int i = 0; i < cells.Count; ++i)
{
if (i == 0)
{ Response.Write("Person Name : " + cells[i].InnerText + "<br>"); }
else {
Response.Write("Other attributes are: " + cells[i].InnerText + "<br>");
}
}
}
Ich bin sicher, dass es viel besser geschrieben werden kann, aber es funktioniert jetzt für mich.
Warum wählen Sie nicht einfach die td
s direkt aus?
foreach (HtmlNode col in doc.DocumentNode.SelectNodes("//table[@id='table2']//tr//td"))
Response.Write(col.InnerText);
Wenn Sie die tr
s für eine andere Verarbeitung wirklich separat benötigen, lassen Sie alternativ das //
und führen Sie Folgendes aus:
foreach (HtmlNode row in doc.DocumentNode.SelectNodes("//table[@id='table2']//tr"))
foreach (HtmlNode col in row.SelectNodes("td"))
Response.Write(col.InnerText);
Das wird natürlich nur funktionieren, wenn die td
s direkte Kinder der tr
s sind, aber sie sollten es sein, oder?
BEARBEITEN:
var cols = doc.DocumentNode.SelectNodes("//table[@id='table2']//tr//td");
for (int ii = 0; ii < cols.Count; ii=ii+2)
{
string name = cols[ii].InnerText.Trim();
int age = int.Parse(cols[ii+1].InnerText.Split(' ')[1]);
}
Es gibt wahrscheinlich eine beeindruckendere Möglichkeit, dies mit LINQ zu tun.