一款很不错的html转xml工具-Html Agility Pack 实现html转Xml

【转】一款很不错的html转xml工具-Html Agility Packhtml

  以前发个一篇关于实现html转成xml的劣做《实现html转Xml》,受到很多网友的关心。该实现方法是借助htmlparser去分解html内容,而后按照dom的结构逐个生成xml字符串。在没有充分实践后,还觉得该方案能解决问题。然而通过实际使用,效率确实很低,并且对一些特殊html属性的转换也不支持,获得的结果差强人意。c#

  偶然一次机会在浏览codeplex网站时,发现一款很不错的html解析以及转换工具,就是本篇标题所提到的Html Agility Pack。Html Agility Pack是codeplex里的一款开源框架,其主要功能是利用对象模型去操做html内容,可以把xpath等xml方面的技术简单、灵活地应用在html文档解析中。正如其介绍所说的那样,该框架很是适合用于开发爬虫,网络数据挖掘工具。更重要的是该框架彻底由c#语言编写,便于对框架的修改和深刻的研究。安全

  下面来看看如何将html转换成xml格式网络

  首先建立一个HtmlDocument对象(该HtmlDocument是Html Agility Pack中的类,并非winform里的那个),全部的对html的操做都经过这个对象实现。框架

HtmlDocument htmlDoc  =   new  HtmlDocument();

接着设置输出成xml的一些选项dom

// 输出成xml格式
htmlDoc.OptionOutputAsXml  =   true ;

加载html字符串内容,同时输出转换结果ide

//  加载html内容
htmlDoc.LoadHtml( @" <html><body>
<table>
         <tr>
         <td>dafd</td>
         <td>
         </tr>
  </table>
</body></html>
" );

 
//  将输出结果保存到字符串流中
  StringBuilder sbXml  =   new  StringBuilder();
  StringWriter sw 
=   new  StringWriter(sbXml);
  htmlDoc.Save(sw);

 Console.WriteLine(sbXml.ToString());

提供的html内容并非良好格式的xml,转换以后的结果:工具

<? xml version="1.0" encoding="gb2312" ?>
< html >
< body >
                
< table >
                    
< tr >
                        
< td > dafd </ td >
                        
< td ></ td >
                    
</ tr >
                
</ table >
</ body >
</ html >

转换以后,自动修复了没有匹配标记,而且加上了xml的声明。网站

另外在使用的时候,若是给定的html文档内容没有根节点,那么转换以后会自动添加一个名称为span的根节点。ui

好比输入的html文档以下:

< script > var  b  = ' b ' ; </ script >
< html >< body >
                
< table >
                    
< tr >
                        
< td > dafd </ td >
                        
< td >
                    
</ tr >
                
</ table >
                
</ body >
</ html >

转换结果以下:

<? xml version="1.0" encoding="gb2312" ?> < span >< script >
//
<![CDATA[
var b ='b';
//
]]> //
</ script >< html >< body >
                
< table >
                    
< tr >
                        
< td > dafd </ td >
                        
< td >
                    
</ td ></ tr >
                
</ table >
                
</ body ></ html ></ span >

这种方式保证了转换时的安全,是否使用仍是看具体的项目要求。

  以上方式是给定了已有的html字符串,还有另一种更加方便的方式,那就是直接给出url路径,利用HtmlWeb就能包办下载以及转换的功能。实现方式以下:

            StringBuilder sbXml  =   new  StringBuilder();
            StringWriter sw 
=   new  StringWriter(sbXml);
            XmlTextWriter tw 
=   new  XmlTextWriter(sw);

            HtmlWeb htmlWeb 
=   new  HtmlWeb();
            htmlWeb.LoadHtmlAsXml(
" http://htmlagilitypack.codeplex.com/ " , tw);

            Console.WriteLine(sbXml.ToString());

以上方式虽然方便,可是有一个不稳定的因素是:下载过来的html文档颇有多是乱码,并确实存在这种状况,为了更好的使用,我修改了下源代码,让其在下载的时候就能自动判断编码方式。

  Html Agility Pack的效率比htmlparser有了很大的提高。可是在处理一些超大页面时,仍是要有一些等待。另外还有一个美中不足的是,转换的结果仍是不能100%地符合表中html格式的内容,只能说是95%地接近,比起firebug的html解析功能还差的远。

 

Html Agility Pack的下载连接

http://htmlagilitypack.codeplex.com/ 

修改过的dll(修复文档下载后乱码的问题)

 HtmlAgilityPack_Shenba

相关文章
相关标签/搜索