单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,10,章,.NET,中的,XML,编程,自微软,2000,年,6,月在“论坛,2000”,上向全球正式推出了,Microsoft.NET,以来,,Microsoft.NET,就成为整个,IT,业界最为关注的话题,越来越多的应用已经开始建立在,.NET,这种新的体系结构之上,并迅速成为信息化应用的潮流与方向。,.NET,分为三个主要部分:,.NET,战略、,.NET,框架、,.NET,企业服务器。,.NET,战略:该战略是基于这样一种想法,即所有的设备将来会通过一个全球宽带网(即,Internet,)连接在一起,同时所有的软件都将成为在该网络上提供的一种服务。,1,关于,.NET,.NET,框架:是指像,ASP.NET,这样可使,.NET,更加具体的新技术。该架构提供了具体的服务和技术,以便于开发人员创建相应的应用程序以支持如今连接岛,Internet,上的用户的需求。,.NET,企业服务器:是指像,SQL Server2000,和,BizTalk Server2000,这样的由,.NET,框架应用程序使用的服务器产品,不过目前它们并不是使用,.NET,框架编写成的。这些服务器产品将来的版本都将支持,.NET,,但不必使用,.NET,重新编写它们。,2.NET,框架,.NET,框架是,.NET,的重要组成部分,是一个开发、部署和运行,.NET,应用的环境。包括了,ASP.NET,、公共语言运行时环境,CLR,以及,.NET,框架类。它由以下,4,个主要部分组成:,应用程序开发技术,类库,基类库,公共语言运行时环境(,CLR,),3.NET,框架对,XML,文档的支持,在,.NET,应用程序内处理,XML,文档时所用的一些主要的对象。,基于,DOM,的方式,System.Xml,含有一组将,XML,文档作为数据的对象。该数据可以通过,XML,文档树的节点、元素和属性等实体来访问。,XML,的这种生成和浏览方式非常灵活,但它比不上基于流的,XML,生成和浏览的性能。将这种方式称为,XMLDOM,分析器。,基于流的方式,System.Xml,中含有许多类,可以读取,XML,和写,XML,到一个流中,由于它表示的是一系列的读和写,所以使用这种方法可以快速的使用或生成一个,XML,文档。使用该方法的局限性在于它并不将,XML,数据作为由有形实体如节点、元素和属性组成的文档。称这种方式为,XML,阅读器。,4,.NET,框架的,XMLDOM,解析器,.NET,框架中支持,DOM,的类主要存在于,System.Xml,和,System.Xml.XmlDocument,名字空间中。这些类分为两个层次:基础类和扩展类。基础类提供了,Core DOM Level 1,标准中用来描述底层的基础接口的集合的特性,这些基础接口可以用来表示任何结构化的文档,更特别地,它们可以被用来定义表示一个,XML,文档所需要的扩展接口。扩展类实现了,Core DOM Level 1,中的所有基础接口和,Core DOM Level 2,中定义的其他接口。,在基础类层次中,,.NET,类库包含了三个类:,XmlNode,类:用来表示文档树中的单个节点,该类具有各种方法和属性,支持对,XML,节点的各种操作。这是一个抽象基类,在扩展类层次中会有这个基类的其他具体派生类的实现;,XmlNodeList,类:用表示一个节点的有序集合,它提供了对迭代操作和索引器的支持。,XmlNamedNodeMap,类:用来表示一个节点的集合,该集合中的元素(即节点)可以使用节点名或索引来访问,支持了使用节点名称和迭代器来对属性集合的访问,并且包含了对名字空间的支持。,扩展类层次包括了众多的类,主要的类有以下几个,它们都是由,XmlNode,类派生出来的:,XmlDocument,该类对应于一个完整的,XML,文档,使用,Load,方法可以加载,XML,文档,也可以从文件(文件名被指定为,String,类型)或通过,TextReader,或,XmlReader,,使用,LoadXm,和包含,XML,文档的字符串来加载,XML,文档。,要存储,XML,文档,使用,Save,方法可以存储格式文件(文件名被指定为,String,类型)、,TextWriter,和,XmlWriter,。,XmlElement,该类表示文档中的一个元素对象。该类中的函数包含许多方法,关于操作元素的属性:,GetAttribute,、,GetAttributeNode,、,RemoveAllAttributes,、,RemoveAttributeAt,、,RemoveAttributeNode,、,SetAttribute,和,SetAttributeNode,。这些方法是,XmlElement,支持的元素特有的子集。,XmlAttribute,该类表示,XmlElement,对象的一个属性。属性包含数据和下一层级的数据列表,因此它比,XmlNode,或,XmlElement,更简单。,XmlAttribute,获取它自己的文档、元素、父节点,名称。,XmlAttributeCollection,该类表示了,XmlElement,对象的属性集合。,XmlComment,该类表示,XML,文档中的注释内容,XmlDeclaration,该类表示,XML,的声明节点,XmlDocumentType,该类表示,XML,文档的,DOCTYPE,声明节点,XmlEntity,该类表示,XML,文档中一个解析过或未解析过的实体,XmlEntityReference,该类表示一个实体引用,XmlText,该类表示了一个元素或属性的文本内容,5.NET,框架的,XML,阅读器,除了,DOM,外,,XML,另一种对数据访问的接口是,SAX,(,Simple Application for XML,)。,.NET,框架虽然不支持,SAX,分析器,但提供类似,SAX,分析器的功能。在,.NET,框架中,,XML,阅读器模拟了,SAX,的功能。通过,XML,阅读器,,SAX,的所有的功能都能很容易的实现并得到更有效的运用。与,SAX,分析器不同的是,,.NET,框架的阅读器整个都运作在客户端应用程序下面。这样,应用程序本身就可以只把真正需要的数据“,pull out”,,然后从,XML,数据流中跳出来。,XML,阅读器支持一个编程接口,该接口用于连接,XML,文档。阅读器工作原理类似于的桌面应用程序从数据库中取出数据的原理。数据库服务返回一个游标对象,它包含所有查询结果集,并返回一个引用,该引用指向目标数据集的开始地址的引用。,XML,阅读器的客户端收到一个指向阅读器实例的引用。该实例提取底层的数据流并把取出的数据呈现为一棵,XML,树。阅读器类提供只读、向前的游标,可以用阅读器类提供的方法滚动游标遍历结果集中的每一条数据。,从阅读器中看,XML,文档不是一个标签文本文件,而是一个串行化的节点集合。它是,.NET,框架中的一种特殊的游标模式,也是,.NET,框架中一个独特的,API,函数。,阅读器和,XMLDOM,分析器的不同之处在于,,XML,阅读器是只进的,它没有父、子、祖宗、兄弟节点的概念,而且是只读的。,在,.NET,框架中,,System.XML.XMLWriter,和,System.XML.XMLReader,这两个抽象类为,.NET,的,pull model,提供了,XML,支持,分别用来完成读写,XML,文档的功能。因此,可以用,XmlReader,和,XmlWriter,类直接处理,XML,数据。,5.1,XmlReader,类,类,XMLReader,的作用就是对输入流进行,XML,包装。它的,Read,方法可以快速地遍历一份文档,但是它只能向前,而不能向后。可以通过,Value,属性回到文档当前节点的内容。,XMLReader,对,XML,文档默认地采用深度优先遍历,这意味着它会先访问一个元素的子元素,然后再访问它的兄弟元素。如对于图中的树形结构,它的访问顺序如图中所注:,XmlReader,类并不支持有效性检查,尽管它会通过产生一个,XmlException,来报告格式上的错误。,XmlReader,具有一些子类,它们扩展了,XmlReader,的功能,同样的,也可以自己扩展出,XmlReader,的子类来为程序开发一个自定义的解读器。,在开发,.NET,应用程序时,对数据的访问主要是通过,XmlReader,类的继承类,XmlTextReader,、,XmlNodeReader,和,XmlValidatingReader,来实现的。,(,1,),XmlTextReader,对,XML,文档的基本解读,XmlTextReader,是,XMLReader,的一个具体子类,它提供了解读,XML,的最基本支持。,XmlTextReader,类用只进,只读的方式快速访问,XML,数据流。阅读器先验证,XML,文档是否是格式良好的,如果不是则抛出一个异常。,XmlTextReader,可以检查,DTD,的格式是否良好,但不使用,DTD,对文档进行验证。,(,2,),XmlNodeReader,基于节点的解读,就像,XmlTextReader,访问指定,XML,流中所有节点一样,,.NET,框架提供了,XmlNodeReader,类,用于访问,XMLDOM,子树的所有节点。,XmlNodeReader,类也支持基于,Xpath,的方法,例如,SelectNodes,方法和,SelectSingleNode,方法。这些方法的作用是把匹配的节点放在内存中。例,8.19,中演使用,SelectSingleNode,方法选中了,XML,文档中的一个节点并输出该节点内容。,(,3,),XmlValidatingReader,有效性检查,XmlValidatingReader,类继承了,XmlReader,类,它提供了支持多种类型的,XML,验证:,DTD,,,XML-Data,Reduced(XDR,),架构以及,XSD,。可以用,XmlVlidatingReader,类去验证,XML,文档和,XML,片断的有效性。,与,XmlTextReader,相比,,XmlVlidatingReader,类中的方法并没有发生重大的改变。通常,用它的,Read,方法去读输入的,XML,文档。在每一步中,检验当前被访问的节点的结构是否与指定的,schema,符合,如果不符合,则抛出一个异常。下例是一个控制台应用程序,输入一个文件名,最后输出验证结果。,与,XmlTextReader,相比,,XmlVlidatingReader,类中的方法并没有发生重大的改变。通常,用它的,Read,方法去读输入的,XML,文档。在每一步中,检验当前被访问的节点的结构是否与指定的,schema,符合,如果不符合,则抛出一个异常。,5.2,XmlWriter,类,.NET,框架通过用,XMLwriter,提供创建,XML,文档的方法。,XML Writer,类以只向前(,forward-only,)的方式输出,XML,数据到流或者文件中。,XML Writer,在设计时就保证了所有的,XML,数据都符合,W3C XML 1.0,推荐规范,用户甚至不用担心忘记写闭标签,因为,XML Writer,会帮写上。,XmlWriter,是所有,XML writer,的抽象基类。,.NET,框架只提供唯一的一个,writer,类,XmlTextWriter,类,通过这个派生类的实例指针,可以输出合乎规范的,XmL,文档。,XmlWriter,写方法功能对应每个可能的,XML,节点类型,结构化地创建,XML,文档。使得代码简洁,易读、结构清晰。,首先来看,XML,元素节点的创建,下面代码演示了怎么样用,XmlTextWriter,类的方法来创建元素节点。,Sub,CreateXm