【发布时间】:2011-06-07 07:05:38
【问题描述】:
我有一个 html 表。我想把它转换成一个数据表。这样做的最佳方法是什么? 谢谢
【问题讨论】:
标签: c#-3.0
我有一个 html 表。我想把它转换成一个数据表。这样做的最佳方法是什么? 谢谢
【问题讨论】:
标签: c#-3.0
不要自己解析 HTML,那里有解析库可以为您做到这一点。结合HTML Agility Pack 和 LINQ,您可以轻松完成这项工作。
var doc = new HtmlDocument();
doc.Load(url);
var nodes = doc.DocumentNode.SelectNodes("//table/tr");
var table = new DataTable("MyTable");
var headers = nodes[0]
.Elements("th")
.Select(th => th.InnerText.Trim());
foreach (var header in headers)
{
table.Columns.Add(header);
}
var rows = nodes.Skip(1).Select(tr => tr
.Elements("td")
.Select(td => td.InnerText.Trim())
.ToArray());
foreach (var row in rows)
{
table.Rows.Add(row);
}
【讨论】:
var headers = nodes[0].Elements("th").Select(th => th.InnerText.Trim()); nodes 是 null。如何使用此控件?我在哪里可以找到有关它的最新文档?
XmlDocument 和相关类之后建模的,所以如果您熟悉使用 XML 库解析 XML,您应该会感到宾至如归。 nodes 是调用 HtmlNode.SelectNodes() 的结果,您将它传入 xpath 选择器。显然在您的示例中没有找到具有直接行的表。
……若干年后……
var nodes = doc.DocumentNode.SelectNodes("//table/tr");
line 有错字,需要在“table”之后加上双斜杠,一切都像魅力一样
var nodes = doc.DocumentNode.SelectNodes("//table//tr");
【讨论】:
tr 元素是table 节点的直接子节点。 (<table><tr>...</tr></table>) 但如果行位于tbody 元素下,则可能需要进行这样的更改。如果是这样的话,那不会错,但我会说这并不常见。但这会有问题,尤其是当涉及到嵌套表时。但是......这纯粹是情景......就像这种情况一样。