欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

在.NET Framework中轻松处理XML数据(1-2)

程序员文章站 2022-03-19 19:23:15
...
?XmlReader类

??XML浏览器支撑一个编程接口,接口用于连接XML文档,“推出”你要的数据。假如你更深进往懂得浏览器,你会发明浏览器工作原理类似于我们的桌面利用程序从数据库中取出数据的原理。数据库服务返回一个游标对象,它包含所有查询成果集,并返回指向目标数据集的开端地址的引用。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}', 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方法移动指针。

以上就是在.NET Framework中轻松处理XML数据(1-2) 的内容,更多相关内容请关注PHP中文网(www.php.cn)!