【问题标题】:What is the best way of converting a Html table to datatable将 Html 表转换为数据表的最佳方法是什么
【发布时间】:2011-06-07 07:05:38
【问题描述】:

我有一个 html 表。我想把它转换成一个数据表。这样做的最佳方法是什么? 谢谢

【问题讨论】:

    标签: c#-3.0


    【解决方案1】:

    不要自己解析 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);
    }
    

    【讨论】:

    • 这会处理 colspan 和表格样式 (css) 吗?看起来它会简单地翻译数据和元素标记
    • @user327999:不,这只是一对一的映射。 DataTables 无论如何都没有这样的东西 AFAIK。
    • 我刚刚下载了 HtmlAgilityPack 1.4.6 来执行此操作。该网站说还没有文档。我尝试按照此处的示例进行操作,但在此得到了 NullReferenceExceptionvar headers = nodes[0].Elements("th").Select(th => th.InnerText.Trim()); nodesnull。如何使用此控件?我在哪里可以找到有关它的最新文档?
    • @jp2code:这取决于您正在解析的标记。诚然缺乏文档,但大多数方法确实有常规的 XML 文档,这应该足够了,我上次检查过。但我相信它是在XmlDocument 和相关类之后建模的,所以如果您熟悉使用 XML 库解析 XML,您应该会感到宾至如归。 nodes 是调用 HtmlNode.SelectNodes() 的结果,您将它传入 xpath 选择器。显然在您的示例中没有找到具有直接行的表。
    • 我做了一些小的调整以适应我的桌子,但效果很好..非常感谢。
    【解决方案2】:

    ……若干年后……

    var nodes = doc.DocumentNode.SelectNodes("//table/tr");
    

    line 有错字,需要在“table”之后加上双斜杠,一切都像魅力一样

    var nodes = doc.DocumentNode.SelectNodes("//table//tr");
    

    【讨论】:

    • 这不一定是正确的,至少,将其归类为错字是错误的……根据情况,可能是错误的。大多数人编写表,其中tr 元素是table 节点的直接子节点。 (<table><tr>...</tr></table>) 但如果行位于tbody 元素下,则可能需要进行这样的更改。如果是这样的话,那不会错,但我会说这并不常见。但这会有问题,尤其是当涉及到嵌套表时。但是......这纯粹是情景......就像这种情况一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 2017-05-24
    • 2018-03-13
    • 1970-01-01
    • 2018-09-23
    相关资源
    最近更新 更多