htmlAgilityPack table d'analyse en datatable ou tableau

c# html-agility-pack linq

Question

J'ai ces tables:

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

J'essaie de transformer en un tableau ou une liste en utilisant ce code:

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

Mais ça ne marche pas. Qu'est-ce qui ne va pas?

Réponse acceptée

Quelques notes:

  • Vous n'avez pas besoin d'un casting
  • vous supposez que chaque ligne a des en-têtes
  • SelectNodes doit recevoir un xpath et vous ne donnez que des noms.

si j'étais vous, j'utiliserais foreach et modéliserais mes données, ainsi j'aurais plus de contrôle et d'efficacité, mais si vous voulez toujours le faire à votre façon, voici comment

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



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi