运用.NET Framework类来解析HTML文件、读取数据并不是最容易的。虽然你可以用.NET Framework中的许多类(如StreamReader)来逐行解析文件,但XmlReader提供的API并不是“取出即可用(out of the box)”的,因为HTML的格式不规范。你可以用正则表达式(regular expression),但如果你对这些表达式运用不熟练,你可能开始时会觉得它们有些难。

Microsoft的XML大师Chris Lovett最近在http://www.gotdotnet.com网站上发布了一个新的SGML解析器,叫做SgmlReader,它可以解析HTML文件,甚至将它们转换成一个格式规范的结构。SgmlReader派生于XmlReader,这就是说,你可以像运用诸如XmlTextReader这样的类来解析XML文件那样来解析HTML文件。在本文中,我将介绍如何用SgmlReader类来解析HTML文件并生成格式规范的HTML,从而使你可以用XPath语句来读取数据。

创建一个SgmlReader实例来解析HTML
在开始运用SgmlReader前,从gotdotnet.com下载它,并将assembly放到你的应用程序bin folder中。在可以运用assembly集后,编写代码来读取你想解析的HTML。在本文的例子中,我们用了HttpWebRequest和HttpWebResponse对象来访问一个远程的HTML文件: HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);HttpWebResponse res = (HttpWebResponse)req.GetResponse();StreamReader sReader = new StreamReader(res.GetResponseStream());

在得到远程的HTML文件后,你就可以创建一个SgmlReader类的实例了。通过将其DocType属性设置为“HTML”,让用户知道你正在处理HTML文件: SgmlReader reader = new SgmlReader();reader.DocType = "HTML";

HTML文件的响应流可以被加载到SgmlReader实例,通过其InputStream属性进行解析。首先将HTML文件流加载到一个TextReader对象,然后将TextReader赋值给InputStream属性: reader.InputStream = new StringReader(sReader.ReadToEnd());

现在,你就可以通过调用SgmlReader的Read()方法来解析HTML文件了: sw = new StringWriter();writer = new XmlTextWriter(sw);writer.Formatting = Formatting.Indented;while (reader.Read()) { if (reader.NodeType != XmlNodeType.Whitespace) writer.WriteNode(reader, true); }}

因为SgmlReader创建了格式规范的HTML,所以你可以用XPath语句来读取不同的节点。下面的代码说明了如何将SgmlReader生成的输出结果加载到一个XPathNavigator,然后如何用一个XPath语句来查询HTML文件结构: StringBuilder sb = new StringBuilder();XPathDocument doc = new XPathDocument(new StringReader(sw.ToString()));XPathNavigator nav = doc.CreateNavigator();XPathNodeIterator nodes = nav.Select(xpath);while (nodes.MoveNext()) { sb.Append(nodes.Current.Value);}return sb.ToString();

点击此处来查看SgmlReader类的一个实例演示。

如果你对XPath语言已经很熟悉,并了解.NET Framework中不同的XML解析API了,那么你就可以很容易地用SgmlReader类来解析HTML并读取数据了。

部分代码C#

private string GetWellFormedHTML(string uri,string xpath) ...{            StreamReader sReader = null;            StringWriter sw = null;            SgmlReader reader = null;            XmlTextWriter writer = null;            try ...{                if (uri == String.Empty) uri = "http://www.XMLforASP.NET";                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);                HttpWebResponse res = (HttpWebResponse)req.GetResponse();                sReader = new StreamReader(res.GetResponseStream());                reader = new SgmlReader();                reader.DocType = "HTML";                reader.InputStream = new StringReader(sReader.ReadToEnd());                sw = new StringWriter();                writer = new XmlTextWriter(sw);                writer.Formatting = Formatting.Indented;                //writer.WriteStartElement("Test");                while (reader.Read()) ...{                    if (reader.NodeType != XmlNodeType.Whitespace) ...{                        writer.WriteNode(reader, true);                    }                }                 //writer.WriteEndElement();                if (xpath == null) ...{                    return sw.ToString();                   } else ...{ //Filter out nodes from HTML                    StringBuilder sb = new StringBuilder();                    XPathDocument doc = new XPathDocument(new StringReader(sw.ToString()));                    XPathNavigator nav = doc.CreateNavigator();                    XPathNodeIterator nodes = nav.Select(xpath);                    while (nodes.MoveNext()) ...{                        sb.Append(nodes.Current.Value + " ");                    }                    return sb.ToString();                }            } catch (Exception exp) ...{                writer.Close();                 reader.Close();                sw.Close();                sReader.Close();                return exp.Message;            }        }

解析HTML文件 - 运用SgmlReader类来解析HTML文件相关推荐

  1. linux读取class下的文件路径,Class类getResource方法获取文件路径

    在应用程序中,经常有需求获取资源文件的路径,并加载之. 其中一个方法就是使用绝对路径,比如: File file = new File("D://xxxx"); 但是不支持跨系统, ...

  2. php mp3文件上传 类,PHP MP3歌曲文件上传

    publicfunctionupload(){$upload=new\Think\Upload();//实例化上传类$upload->maxSize=3*1024*1024;//设置附件2113 ...

  3. 文件映射操作类的实现

    文章目录 1 文件映射操作类的实现 1 文件映射操作类的实现 mmap_file_op.h: #ifndef QINIU_LARGEFILE_MMAPFILE_OP_H_ #define QINIU_ ...

  4. C++文件输入/输出流类

    文章目录 文件输入/输出流类 表5: 文件读写模式 表6:ios_base 标识的组合意义 ofstream:写入文件的流类 例8:输出文本文件 例9:输出二进制文件 ifstream:从文件中读取的 ...

  5. Properties文件和Properties类

    Properties文件和Properties类 是什么 Properties文件 Properties类 简述 构造方法 基本的存储方法 与流相关的方法 Properties文件和Propertie ...

  6. Springboot实现文件上传,并防止同文件重复上传

    目录 主要流程 编写接受文件上传的Controller 编写文件操作结果类 编写文件操作类 知识总结 参考 主要流程 在配置文件中添加文件操作的配置,示例: storage:image:#保存位置sa ...

  7. kotlin 读取json文件_Kotlin数据类及json解析

    通过数据类,可以方便地得到很多有趣的函数,一部分是来自属性,比如编写getter和setter函数,还有下面这些函数:equals(): 比较两个对象的属性来确保他们是相同的. hashCode(): ...

  8. java常用类解析五:IO系统File类及文件搜索工具类

    1.先看一个File类的简单的例子 [java] view plaincopy <span style="font-size:16px;">package test; ...

  9. python中读取文件内容-深入学习python解析并读取PDF文件内容的方法

    这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应 ...

最新文章

  1. db2关闭下一句sql的日志_MySQL 用户和权限管理,日志体系简介
  2. Python 实现批量从不同的Linux服务器下载文件
  3. 快来围观一下JavaScript的Proxy
  4. php 计划任务 不执行,CentOS 系统下 Laravel 计划任务 PHP artisan schedule:run 不执行,应该如何处理?...
  5. USACO-Section1.5 Arithmetic Progressions(枚举)
  6. java 获取http地址_java如何获取当前时间,java如何获取ip地址
  7. python启动远端 exe_python打包exe开机自动启动的实例(windows)
  8. python三大圣经-读书分享全网学习资源大合集,推荐Python学习手册等三本书「01」...
  9. scrollIntoView()窗口滚动
  10. 算法学习——递归和排列组合
  11. 国产化性能最高的服务器,盘点服务器国产化呼声背后的优秀厂商
  12. python爬虫实战:之爬取京东商城实例教程!(含源代码)
  13. 网页集成高德地图显示
  14. c#Winform自定义控件-目录
  15. 低照度水下图像增强论文(L2UWE)+代码+评价方法
  16. python中的除法、取整和求模_python中的除法,取整和求模
  17. char *str1 和 char str2[]的详解
  18. android 关于闹钟
  19. 俞军产品方法论|第三章 交易|摘要笔记
  20. 基于R对数据中分类变量按照某一个分类变量的类别计算频数

热门文章

  1. C语言实现数值积分之Simpson 1/3法则(附完整源码)
  2. C语言实现数组Array(附完整源码)
  3. 经典C语言程序100例之十五
  4. C++变量、函数在内存中的情况
  5. linux上的ftp怎么设置编码格式,linux ftp客户端的编码问题
  6. 24-Logistic Regression
  7. Spark Streaming实现实时WordCount,DStream的使用,updateStateByKey(func)实现累计计算单词出现频率
  8. 11Linux服务器编程之:VFS虚拟文件系统,dup()函数和dup2()函数
  9. ContextLoaderListener的用途以及配置方式
  10. JavaGUI中的JComboBox的处理