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的主要内容,如果未能解决你的问题,请参考以下文章