htmlAgilityPack analysiert Tabelle auf Datentabelle oder Array

c# html-agility-pack linq

Frage

Ich habe diese Tabellen:

<table>
<tbody>
<tr><th>Header 1</th></tr>
</tbody>
</table>

<table>
<tbody>
<tr>
<th>Header 1</th>
<th>Header 2</th>
<th>Header 3</th>
<th>Header 4</th>
<th>Header 5</th>
</tr>
<tr>
<td>text 1</td>
<td>text 2</td>
<td>text 3</td>
<td>text 4</td>
<td>text 5</td>
</tr>
</tbody>
</table>

Ich versuche mithilfe dieses Codes in ein Array oder eine Liste umzuwandeln:

var query = from table in doc.DocumentNode.SelectNodes("//table").Cast<HtmlNode>()
                         from row in table.SelectNodes("tr").Cast<HtmlNode>()
                         from header in row.SelectNodes("th").Cast<HtmlNode>()
                         from cell in row.SelectNodes("td").Cast<HtmlNode>()
                         select new { 
                             Table = table.Id, 
                             Row = row.InnerText, 
                             Header = header.InnerText,
                             CellText = cell.InnerText
                         };

Aber es funktioniert nicht. Was ist falsch?

Akzeptierte Antwort

Einige Notizen:

  • Sie brauchen keine Besetzung
  • Sie nehmen an, dass jede Zeile Header hat
  • SelectNodes muss einen xpath erhalten und Sie übergeben nur Namen

wenn ich du wäre, würde ich eine foreach benutzen und meine daten modellieren, auf diese weise bekomme ich mehr kontrolle und effizienz, aber wenn du es immer noch so machen willst, ist es so, wie es sein sollte

var query = from table in doc.DocumentNode.SelectNodes("//table")
                        where table.Descendants("tr").Count() > 1 //make sure there are rows other than header row
                        from row in table.SelectNodes((".//tr[position()>1]")) //skip the header row
                        from cell in row.SelectNodes(("./td")) 
                        from header in table.SelectNodes(".//tr[1]/th") //select the header row cells which is the first tr
                        select new
                        {
                            Table = table.Id,
                            Row = row.InnerText,
                            Header = header.InnerText,
                            CellText = cell.InnerText
                        };


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum