XmlReader类
XML阅读器支持一个编程接口,接口用于连接XML文档,“推出”你要的数据。如果你更深入去了解阅读器,你会发现阅读器工作原理类似于我们的桌面应用程序从数据库中取出数据的原理。
从阅读器中看XML文档不是一个标签文本文件,而是一个序列化的节点集合。它是.NET Framework中的一种特殊的游标模式;在.NET Framework中,你找不到其它的任何一个类似的API函数。
阅读器和XMLDOM分析器有几点不同的地方。XML阅读器是只进的,它没有父、子、祖宗、兄弟节点的概念,而且是只读的。在.NET Framework中,读写XML文档是分为两种完全不同的功能,分别由XmlReader和XmlWriter类来完成。要编辑XML文档,你可以用XMLDOM分析器,或者你自己设计一个类来实现这两种功能。让我们开始分析阅读器的程序功能。
XmlReader是一个抽象类,你可以继承并扩展它的功能。用户程序一般都基于下面的三种类:XmlTextReader、XmlValidatingReader或者 XmlNodeReader类。所有的这些类都有如图一的属性和图二的方法。要注意的是,某些属性的值实际上依赖于实际的某个阅读器类,不同的类与基类可能不同。因此,在图一中每个属性的说明都是以基类为准的。例如,CanResolveEntity属性在XmlValidatingReader类中只返回true;而在其它的阅读器类中它却可以设为false。同样的,在图二中的某些方法的实际返回值对不同的类可能不同。例如,如果节点类型不是元素节点(element node),所有包含Atrributes的方法的返回值类型都是void。
XmlTextReader类用只进,只读的方式快速访问XML数据流。阅读器先验证XML文档是否是格式良好的,如果不是则抛出一个异常。XmlTextReader 检查 DTD 的格式是否良好,但不使用 DTD 对文档进行验证。XmlTextReader通过XML文档的文件名,或它的URL,或者从文件流中载入XML文档,然后快速的处理XML文档数据。如果你需要对文档的数据进行验证,你可以用XmlValidatingReader类。
可以用多种方法创建XmlTextReader类的实例,从硬盘中加载文件,或从URL地址中加载,流(streams)中加载,还有就是从文本中读入XML文档数据:
XmlTextReader reader = new XmlTextReader(file);
注意,所有XmlTextReader类的公共(public)构造函数都要求你指定数据源,数据源可以是stream、文件或者其它。XmlTextReader默认的构造函数是受保护的(protected),所以不能直接使用。像.NET Framework中所有的阅读器类一样(如SqlDataReader类),一旦阅读器对象连接并打开,你就可以用Read方法去访问数据了。开始的时候只能用Read方法把指针移到第一个元素;然后我们可以用Read方法或其它方法(如Skip, MoveToContent和ReadInnerXml)移动指针到下一个节点元素。要处理整个XML文档的内容,可以根据Read方法的返回值用一个循环遍历文档内容,因为Read方法返回一个布尔值,当读到文档的尾节点时,Read方法返回false,否则它返回true。
Figure 3 Outputting an XML Document Node Layout
string GetXmlFileNodeLayout(string file)
{
// 创建一个XmlTextReader类使它指向目标XML文档
XmlTextReader reader = new XmlTextReader(file);
// 循环取出节点的文本并放入到StringWriter对象实例中
StringWriter writer = new StringWriter();
string tabPrefix = "";
while (reader.Read())
{
// 写开始标志,如果节点类型为元素
if (reader.NodeType == XmlNodeType.Element)
{
//根据元素所处节点的深度,加入reader.Depth个tab符,然后把元素名写入到<>中。
tabPrefix = new string('\t', reader.Depth);
writer.WriteLine("{0}<{1}>", tabPrefix, reader.Name);
}
else
{
//写结束标志,如果节点类型为元素
if (reader.NodeType == XmlNodeType.EndElement)
{
tabPrefix = new string('\t', reader.Depth);
writer.WriteLine("{0}{1}>", tabPrefix, reader.Name);
}
}
}
// 输出到屏幕
string buf = writer.ToString();
writer.Close();
// 关闭流
reader.Close();
return buf;
}
图三演示了一个简单的用于输出一个给定的XML文档的节点元素的函数。该函数先打开一个XML文档,然后用循环处理XML文档中所有的内容。每次调用Read方法,阅读器的指针都会向下移一个节点。大部分情况下,用Read方法可以处理的元素节点,但有时候,当你从一个节点移动到下一个节点时,可能是在两个不同类型的节点间移动。但是Read方法不能在属性节点之间移动。阅读器的MoveToContent方法可以让指针从头部节点位置跳到第一个内容节点位置。在ProcessingInstruction, DocumentType, Comment, Whitespace和SignificantWhitespace类型节点中也可以用Skip方法移动指针。
本U R L:http://www.qqread.com/xml-soap/e617105012.html
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
- 数据库处理专题 (8607篇文章)
- .NET Framework新手入门 (132篇文章)
- .NET移动与嵌入式技术 (5950篇文章)
- .NET开发手册 (5652篇文章)
- XML详解 (1541篇文章)
- .NET基础介绍 (713篇文章)
- .NET框架架构 (465篇文章)
- 开发应用 (622篇文章)
- 浅谈SOAP (5441次浏览)
- 推荐两个不错的python资源 (1624次浏览)
- 处理XML字符串中特殊字符 (1588次浏览)
- 一个通过DataSet操作XML的类 (969次浏览)
- .NET Framework轻松处理XML数据 (812次浏览)
- ASP插入数据换行问题解决方法 (793次浏览)
- SQL2000的XML功能将现有的存储过程代码作为W (620次浏览)
- 网页屏蔽(左右键,代码等)的非JS方法 (599次浏览)
- XML入门之11问答(1) (573次浏览)
- SAX解析XML (534次浏览)



