C# - 将 HTML 源解析为 XML

Posted

技术标签:

【中文标题】C# - 将 HTML 源解析为 XML【英文标题】:C# - Parse HTML source as XML 【发布时间】:2011-03-02 06:34:36 【问题描述】:

我想读入包含 html 文件的动态 URL,然后像 XML 文件一样读取它,基于节点(HTML 标记)。这有可能吗?

我的意思是,有这个 HTML 代码:

            <table class="bidders" cellpadding="0" cellspacing="0"> 

            <tr class="bidRow4"> 
                <td>kucik (automata)</td> 
                <td class="right">9 374 Ft</td> 
                <td class="bidders_date">2010-06-10 18:19:52</td> 
            </tr> 

            <tr class="bidRow4"> 
                <td>macszaf (automata)</td> 
                <td class="right">9 373 Ft</td> 
                <td class="bidders_date">2010-06-10 18:19:52</td> 
            </tr> 

            <tr class="bidRow2"> 
                <td>kucik (automata)</td> 
                <td class="right">9 372 Ft</td> 
                <td class="bidders_date">2010-06-10 18:19:42</td> 
            </tr> 

            <tr class="bidRow2"> 
                <td>macszaf (automata)</td> 
                <td class="right">9 371 Ft</td> 
                <td class="bidders_date">2010-06-10 18:19:42</td> 
            </tr> 

            <tr class="bidRow0"> 
                <td>kucik (automata)</td> 
                <td class="right">9 370 Ft</td> 
                <td class="bidders_date">2010-06-10 18:19:32</td> 
            </tr> 

            <tr class="bidRow0"> 
                <td>macszaf (automata)</td> 
                <td class="right">9 369 Ft</td> 
                <td class="bidders_date">2010-06-10 18:19:32</td> 
            </tr> 

            <tr class="bidRow8"> 
                <td>kucik (automata)</td> 
                <td class="right">9 368 Ft</td> 
                <td class="bidders_date">2010-06-10 18:19:22</td> 
            </tr> 

            <tr class="bidRow8"> 
                <td>macszaf (automata)</td> 
                <td class="right">9 367 Ft</td> 
                <td class="bidders_date">2010-06-10 18:19:22</td> 
            </tr> 

            <tr class="bidRow6"> 
                <td>kucik (automata)</td> 
                <td class="right">9 366 Ft</td> 
                <td class="bidders_date">2010-06-10 18:19:12</td> 
            </tr> 

            <tr class="bidRow6"> 
                <td>macszaf (automata)</td> 
                <td class="right">9 365 Ft</td> 
                <td class="bidders_date">2010-06-10 18:19:12</td> 
            </tr> 

        </table> 

我想将其解析为 ListView(或 Grid)以创建包含数据的行。所有 tr 都是不同的行,并且给定 td 中的所有 td 都是给定行中的列。

而且我希望它尽可能快,因为它会在 5 秒内自行更新。

有这方面的图书馆吗?

【问题讨论】:

【参考方案1】:

我推荐HTML Agility Pack。您必须自己处理 GUI 部分。它不需要有效的 HTML,但会创建一个类似于 XmlDocument 的 HtmlDocument。

【讨论】:

【参考方案2】:

为什么不直接进行字符串替换来将 HTML 表转换为 XML:

   <table class="bidders" cellpadding="0" cellspacing="0">

变成:

   <?xml version="1.0" encoding="UTF-8"?>

  <tr class="bidRow4">

变成

  <item>

 <td class="right">

变成

 <field1>

编辑 1:

我也认为 DataSet 类有一个:

.ReadXML

这样您就可以将数据绑定到该数据集的方法:

    DataSet ds = new DataSet();
    ds.ReadXml("foo.xml");
    DataGrid.DataSource = ds;
    DataGrid.DataBind();

或类似的东西

【讨论】:

我不想转换,因为即使使用 XMLdocument 读取简单的 XML 文档也需要很长时间。 听起来像是您试图从网站上抓取数据,但永远不会有快速的方法来做到这一点。您需要找到另一种获取该数​​据的方法,您对这些数据还有哪些其他访问权限? 只有这个 HTML 页面,因为它是由未知脚本以未知方式从未知数据库呈现的。所以没有更多的访问权限,直到我可以解决这个问题。 DataSet 方法的一个问题 - 此文件有子节点。所以会引发异常,而且不能悲催。 对不起,我不确定你的意思,你真的试过这个方法吗?【参考方案3】:

我通常将Fast XPath Reader 与 LinqToXML 结合使用来完成这项工作。不过它已经相当老了(2007 年)。

我不知道 HTML Agility Pack,所以我不能说它的比较(在性能和易用性方面)。

【讨论】:

【参考方案4】:

当然,这是可能的。但请注意——兼容的 xml 处理器应该将任何格式不正确的内容视为致命错误。这意味着它只适用于通过 xhtml strict 验证的文档。

【讨论】:

不完全。 XHTML 严格标准定义了附加要求,例如哪些属性可用于哪些标记、哪些标记可以放置在何处等。除非 HTML 文档链接到一个模式并且 XML 解析器实际使用该模式,否则文档只需要语法上有效的 XML。 这个页面的语法永远不会改变,我想阅读它的内容。也许最好的解决方案是 RegEx? @fonix232 - ***.com/questions/1732348/… 正如我所说,语法永远不会改变,只是数据。因此,如果我将文件读入字符串,这可以由 RegEx 解析。更新时没有任何更改,没有其他信息,也没有任何内容。只有那些字段。

以上是关于C# - 将 HTML 源解析为 XML的主要内容,如果未能解决你的问题,请参考以下文章

如何解析 HTML 或将 HTML 转换为 XML,以便我从网站中提取信息(在 C# 中)[重复]

C# 将 XML 解析为带有子元素的对象

XML 和 HTML 表用 C# 解析

C# 将 XML 文件从给定标签解析为对象

C# - 解析网页的最佳方法?

无法以所需的方式将 XML 属性值解析为 C# 枚举