テーブルをデータテーブルまたは配列に解析するhtmlAgilityPack

c# html-agility-pack linq

質問

私はこれらのテーブルを持っています:

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

私はこのコードを使用して配列またはリストに変換しようとしています:

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

しかし、それは動作しません。なにが問題ですか?

受け入れられた回答

いくつかのメモ:

  • あなたはキャストは必要ありません
  • 各行にヘッダーがあると仮定しています
  • SelectNodesはxpathを受け取り、名前だけを渡す必要があります

私があなただったら私はforeachを使い、私のデータをモデル化します。それはもっとコントロールと効率を得ることになりますが、それでもあなたのやり方をしたいのなら、これはどうすべきかです

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


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ