htmlファイルのテーブルをデータセットに解析しようとしています。私はvb.netを使用してWindowsアプリケーションを作成し、私は次の関数を使用しています:私はそれが最初の行はcolspan=2
を持つ列が含まだとHTMLテーブルを解析する時までhtmlテーブルをデータセットに解析中にエラーが発生しました
Public Function GetDataSet(ByVal strWebFilePath As String) As DataSet
Dim html As String = System.IO.File.ReadAllText(strWebFilePath)
html = WebUtility.HtmlDecode(html)
Dim dsHtml As New DataSet
Dim htmldoc As New HtmlAgilityPack.HtmlDocument
htmldoc.LoadHtml(html)
Dim tables = htmldoc.DocumentNode.SelectNodes("//table//tr") _
.GroupBy(Function(x) x.Ancestors("table").First())
For i As Integer = 0 To tables.Count - 1
Dim rows = tables(i).ToList()
dsHtml.Tables.Add(String.Format("Table {0}", i))
Dim headers = rows(0).Elements("th").Select(Function(x) x.InnerText.Trim).ToList()
If headers.Count > 0 Then
For Each Hr In headers
dsHtml.Tables(i).Columns.Add(Hr)
Next
For j As Integer = 1 To rows.Count - 1
Dim row = rows(j)
Dim dr = row.Elements("td").Select(Function(x) x.InnerText.Trim).ToArray()
dsHtml.Tables(i).Rows.Add(dr)
Next
Else
headers = rows(0).Elements("td").Select(Function(x) x.InnerText.Trim).ToList()
For ColumnIndex As Integer = 0 To headers.Count - 1
dsHtml.Tables(i).Columns.Add("F" & ColumnIndex.ToString)
Next
For j As Integer = 0 To rows.Count - 1
Dim row = rows(j)
Dim dr = row.Elements("td").Select(Function(x) x.InnerText.Trim).ToArray()
dsHtml.Tables(i).Rows.Add(dr)
Next
End If
Next
Return dsHtml
End Function
すべてが正常に動作している(最初の行は、ヘッダーと考えられています<th>
を含まない場合でも)。だから、この例外がスローされます。
型「System.ArgumentExceptionの」の未処理の例外がのSystem.Data.dll で発生しました追加情報:入力配列が長く、このテーブルの列数を超えています。
は、このテーブルの例を考えてみます。
<table>
<tr><td colspan=2>Links</td></tr>
<tr><td>1</td><td>www.stackoverflow.com</td></tr>
<tr><td>2</td><td>www.sqlservercentral.com</td></tr>
<tr><td>3</td><td>www.dba.stackexchange.com/</td></tr>
</table>
は、2列に最初の行を分割するが方法である:
- 最初の自動生成を含む
Links
- 秒を含みます値(すなわち:
Col1
)
オフトピック:私はそれは良いアイデアだかいないかどうかわからないんだけど、あなたが持っている冗長なコードを取り除くことができます'薄いヘッダー=行(0).Elements(" th ")。連合(行(0).Elements(" td "))。を選択すると、' th'または 'td'に基づいてヘッダーを取得する。あなたのコードの 'else'部分を削除することができます。 –