基于的XML编程技术.ppt_第1页
基于的XML编程技术.ppt_第2页
基于的XML编程技术.ppt_第3页
基于的XML编程技术.ppt_第4页
基于的XML编程技术.ppt_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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企业服务器:是指像SQLServer2000和BizTalkServer2000这样的由.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名字空间中。这些类分为两个层次:基础类和扩展类。基础类提供了CoreDOMLevel1标准中用来描述底层的基础接口的集合的特性,这些基础接口可以用来表示任何结构化的文档,更特别地,它们可以被用来定义表示一个XML文档所需要的扩展接口。扩展类实现了CoreDOMLevel1中的所有基础接口和CoreDOMLevel2中定义的其他接口。在基础类层次中,.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(SimpleApplicationforXML)。.NET框架虽然不支持SAX分析器,但提供类似SAX分析器的功能。在.NET框架中,XML阅读器模拟了SAX的功能。通过XML阅读器,SAX的所有的功能都能很容易的实现并得到更有效的运用。与SAX分析器不同的是,.NET框架的阅读器整个都运作在客户端应用程序下面。这样,应用程序本身就可以只把真正需要的数据“pullout”,然后从XML数据流中跳出来。XML阅读器支持一个编程接口,该接口用于连接XML文档。阅读器工作原理类似于的桌面应用程序从数据库中取出数据的原理。数据库服务返回一个游标对象,它包含所有查询结果集,并返回一个引用,该引用指向目标数据集的开始地址的引用。XML阅读器的客户端收到一个指向阅读器实例的引用。该实例提取底层的数据流并把取出的数据呈现为一棵XML树。阅读器类提供只读、向前的游标,可以用阅读器类提供的方法滚动游标遍历结果集中的每一条数据。,从阅读器中看XML文档不是一个标签文本文件,而是一个串行化的节点集合。它是.NET框架中的一种特殊的游标模式,也是.NET框架中一个独特的API函数。阅读器和XMLDOM分析器的不同之处在于,XML阅读器是只进的,它没有父、子、祖宗、兄弟节点的概念,而且是只读的。在.NET框架中,System.XML.XMLWriter和System.XML.XMLReader这两个抽象类为.NET的pullmodel提供了XML支持,分别用来完成读写XML文档的功能。因此,可以用XmlReader和XmlWriter类直接处理XML数据。,5.1XmlReader类类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-DataReduced(XDR)架构以及XSD。可以用XmlVlidatingReader类去验证XML文档和XML片断的有效性。与XmlTextReader相比,XmlVlidatingReader类中的方法并没有发生重大的改变。通常,用它的Read方法去读输入的XML文档。在每一步中,检验当前被访问的节点的结构是否与指定的schema符合,如果不符合,则抛出一个异常。下例是一个控制台应用程序,输入一个文件名,最后输出验证结果。与XmlTextReader相比,XmlVlidatingReader类中的方法并没有发生重大的改变。通常,用它的Read方法去读输入的XML文档。在每一步中,检验当前被访问的节点的结构是否与指定的schema符合,如果不符合,则抛出一个异常。,5.2XmlWriter类.NET框架通过用XMLwriter提供创建XML文档的方法。XMLWriter类以只向前(forward-only)的方式输出XML数据到流或者文件中。XMLWriter在设计时就保证了所有的XML数据都符合W3CXML1.0推荐规范,用户甚至不用担心忘记写闭标签,因为XMLWriter会帮写上。XmlWriter是所有XMLwriter的抽象基类。.NET框架只提供唯一的一个writer类XmlTextWriter类,通过这个派生类的实例指针,可以输出合乎规范的XmL文档。XmlWriter写方法功能对应每个可能的XML节点类型,结构化地创建XML文档。使得代码简洁,易读、结构清晰。首先来看XML元素节点的创建,下面代码演示了怎么样用XmlTextWriter类的方法来创建元素节点。,SubCreateXmlFileUsingWriters()DimfilenameasStringfilename=”animal.xml”将元素名称放入字符串数组theArray中DimtheArray()asString=“name”,“name”,“weight”,“length”定义XMLwriter的实例xmlwDimxmlwasNewXmlTextWriter(filename,null)xmlw.Formatting=Formatting.Indented用xmlw写入根元素animalxmlw.WriteStartDocument()xmlw.WriteStartElement(“animal”)用xmlw依次写入子元素DimsasstringForEachsIntheArrayxmlw.WriteStartElement(s)xmlw.WriteEndElement()Nextxmlw.WriteEndElement()xmlw.WriteEndDocument()关闭xmlwxmlw.Close()EndSub,下面是XML属性节点的创建,可以用两种方法来写属性节点。第一种方法是用WriteStartAtribute方法去创建一个新的属性节点,更新Writer的状态。接着用WriteString方法设置属性值。写完后,用WriteEndElement方法结束该节点。第二种方法是用WriteAttributeString方法去创建新的属性节点,当writerr的状态为Element时,WriterAttributeString开始工作,它单独创建一个属性。同样的,WriteStartElement方法写节点的开始标签(”。如果想写闭标签则可用WriteFullEndElement方法来写。以第二种方法为例,在上述代码基础上进一步创建属性节点。,SubCreateXmlFileUsingWriters()DimfilenameasStringfilename=”animal.xml”将元素名称放入字符串数组theArray中DimtheArray()asString=“name”,“name”,“weight”,“length”将属性值放入字符串数组attr_theArray中本例中,只有元素name具有属性languageDimattr_theArray()asString=“English”,“Latin”定义XMLwriter的实例xmlwDimxmlwasNewXmlTextWriter(filename,null)xmlw.Formatting=Formatting.Indented用xmlw写入根元素animalxmlw.WriteStartDocument()xmlw.WriteStartElement(“animal”)用xmlw依次写入子元素DimsasstringDimiasInteger=0ForEachsIntheArrayxmlw.WriteStartElement(s)判断是否为元素nameIfs=“name”then给元素name添加属性language,属性的值从attr_theArray数组中读取出来xmlw.WriteAttributeString(“language”,attr_theArray(i)i+=1EndIfxmlw.WriteEndElement()Nextxmlw.WriteEndElement()xmlw.WriteEndDocument()关闭xmlwxmlw.Close()EndSub,然而XmlWriter也存在一定的局限性,XmlWriter不能修复输入的错误。XmlWriter不会检查元素名和属性名是否有效,也不保证被用的任何的Unicode字符集适合当前架构的编码集。如上所述,为了避免输出错误,必须要杜绝非XML字符。但是writer没有提供这种方法。另外,当创建一个属性节点时,Writer不会检验属性节点的名称是否与已存在的元素节点的名称相同。最后,XmlWriter类不是一个带验证的Writer类,也不保证输出是否符合schema或者DTD。在.NET框架中带验证的writer类目前来说还没有提供。Writer把输出文本存在内部的一个缓冲区内。一般情况下,缓冲区会被刷新或者被清除,当Writer被关闭前XML文本应该要写出。在任何时都可以通过调用Flush方法清空缓冲区,把当前的内容写到流中(通过BaseStream属性暴露流),然后释放部分占用的内存,Writer仍保持为打开状态(openstate),可以继续操作。注意,虽然写了部分的文档内容,但是在Writer没有关闭前其它的程序是不能处理该文档的。另外,还应该注意避免传送给写方法的文本中包含敏感的标记字符,例如小于号()。用WriteRaw方法写入流的字符串不会被解析,可以用它来对xml文档写入特殊的字符串。下面的两行代码,第一行输出的是”,6.NET框架的XML数据管理,.NET对XML的支持还涉及到.NET对关系型数据的支持,因为XML是.NET数据访问类中保存数据的标准格式。实际上,在.NET框架中,XML确实是所有数据存储和串行化的基础。其中,不再有MIME编码的记录集对象或者COM对象,它们都是以自己特定格式保存数据的。DataSet对象就是一个很好的例子。将它看作一个用来存放一个或多个数据表的容器(这有点像多个记录集对象的封套)。在需要使用相关技术访问数据时,这种方法非常合理。DataSet可以将其内容保存到磁盘文件中,或者是写到像Stream这样的其他对象中。此时数据的格式为XML。本节内容将着重介绍XML和DataSet对象间的相互转换。,6.1数据从DataSet到XML的转换将数据从DataSet输出为XML时,有两种基本处理方法:将数据放到元素中作为文本内容每个数据行都用一个单独的元素,并将数据本身放到该元素的属性中第一种方法是使用数据项来作为元素的一个分层结构的文本内容,具有较好的可读性。但是由于这样有较多的标记(也就是元素标记),于是会生成一个更大的文档。第二种方法将数据放到元素的属性中,虽然使生成的文档较小,但在使用诸如DOM这样的其他XML方法来访问内容时,可能会比较困难。,本节将以第一种方法为例,介绍如何将数据从DataSet中导入到XML文档。一个DataSet可以包含多个表以及这些表间的关系。其中的每一个关系(DataRelation对象)都有一个Nested属性。其默认值为False,而且在使用相关技术访问数据时(例如,再将数据绑定到一个DataGrid或者对表的Rows集合进行迭代时),这个属性对之都没有什么影响。但是,当使用GetXML或WriteXml方法时,它就会影响数据被输出为XML的方式。在下面的例子中,进一步加以说明,通过修改Nested属性,生成结构不同的XML文档。先在数据库中建立如下三个表:,接下来,创建一个DataSet对象,并用这三个表“Books”、“Authors”、“Prices”来填充它;同时,DataSet还创建了这三个表间的两个关系(DataRelations)。代码如下:,然后,将DataSet中的数据写到磁盘上的一个XML文档中,并且显示一个超链接以便查看它:DimfilenameAsStringfilename=Server.MapPath(NormalXML.xml)objDs.WriteXml(filename)Me.HyperLink1.NavigateUrl=NormalXML.xmlMe.HyperLink1.Text=NormalXMLfile此时,名为BookAuthors和BookPrices的两个关系的Nested属性的默认值都为False。通过超链接,可以看到NormalXML.xml文件在浏览器中显示如图所示:,根元素下含有三个独立的子元素、和,它们分别由DataSet中的三个表转换而来。它们之间没有父元素和子元素之间的层次概念,都处在同一“水平”(即为兄弟节点)。但是,它们都含有主键ISBN,所以如果需要的话,应用程序就可以以相关方式来读取并处理数据。下面将Nested属性设为True,再将DataSet中的数据写到磁盘上的另一个XML文档中,同样显示一个超链接来查看它:objDs.Relations(BookAuthors).Nested=TrueobjDs.Relations(BookPrices).Nested=Truefilename=Server.MapPath(NestedXML.xml)objDs.WriteXml(filename)Me.HyperLink2.NavigateUrl=NestedXML.xmlMe.HyperLink2.Text=NestedXMLfile在浏览器中查看NestedXML.xml文件,如图所示:,与上图进行比较,不难看出两个文件的不同之处。在第一副图中,关系“BookPrices”和关系“BookAuthors”的Nested属性被设为True,即可嵌套,故只有一个子元素,它包含了和两个子元素,形成了嵌套关系。但要注意,也许这种格式存在的弊端,就是在子元素中主键会重复出现。6.2XML与DataSet转换的工具XmlDataDocument对象在上面的介绍中,已经知道了可以用XmlDocument对象和XPathDocument对象来存储和处理XML数据。在这里,将介绍另一种文档对象的实现方法XmlDataDocument对象。DataSet为从关系数据集到XML文档和XML模式的传输及其反向传输提供了一种极好的工具支持。利用XmlDataDocument对象,可实现数据从XML到DataSet的转换。在DataSet中修改数据不仅更为便捷,还可保证该数据在XML形式中的更改同步实现。,XmlDataDocument对象是对XmlDocument对象的扩充,它提供一套相同的属性和方法。然而,它也起着联系XML和关系型数据访问方法的“桥梁”的作用。在用XML文档装载数据时,该对象就能将该文档以DataSet对象的形式展现出来。这就使得不但可以使用关系型数据编程技术来处理这些数据,还可以用XmlDocument对象中的XMLDOM技术来执行该操作。XmlDocument和XmlDataDocument对象的惟一真正的外部区别就是,后者有几个附加属性和方法。其中最有用的就是名为DataSet的属性。它会返回一个对象的引用,该引用指向一个XML文档中的数据,但所看到的则是一个DataSet。这个属性是只读的。,下图可以使对XmlDataDocument的工作方式有一个初步了解。,能够通过各种Reader对象(如XmlNodeReader,XmlTextReader等)来访问XML文档,还可以将文档加载到一个DataSet中。但是,在将XML加载到一个XmlDataDocument对象之后,就可以引用一个包含相同数据的DataSet对象,这相当于将数据读入了那个DataSet中。而且,无论改变DataSet还是XmlDataDocument中的数据,两者都会发生相应变化。它们是完全自动同步的。实际上,得到的是同一数据的两种不同显示方式而已,就像上图所示那样。这意味着这两种数据(关系数据或者XML数据)之间再也没有差别,它们只是同一数据的两种显示方式。所以一旦得到了XmlDataDocument中的数据,就可以随意选择用关系数据库中针对DataSet的方法,或者用.NET中处理XML的方法来访问该数据。,7XML的串行化,7.1串行化概述串行就是获取一个对象并将它转换成一种它可以在网络上传输或者输送到某个存储单元的格式的过程。存储单元就像是一个文件或者数据库那么简单。串行的格式包含对象的状态信息。非串行就是使用串行的状态信息将对象从串行状态还原成原始状态的过程。从本质上说,串行过程允许对象被远程调用在网络上运载或者输送到某个存储单元(如ASP.NET缓存区),并可以在以后的应用中被及时使用和及时重建。.NET框架对创建分布式应用程序和服务提供了广泛的、可扩展的支持。当创建一个分布式系统时,一个必须要解决的问题就是如何实现将对象从系统的一部分传送到另一部分。,.NET框架中的XmlSerializer类提供了串行化的方法,它使能够将自己的对象串行和反串行化为XML。它存在于System.Xml.Serialization命名空间的System.Xml.dll中,用一种高度松散耦合的方式提供串行化服务。串行化机制的可定制性很强,因此可以很灵活地控制对象串行化为XML的格式(如:可以用XSD模式来定义在串行化过程中产生的XML文档结构)。除了串行化为XML以外还有BinaryFormatter和SoapFormatter格式化类。BinaryFormatter将对象串行化为二进制格式。这样可以高效地传输到远程应用程序。SoapFormatter将对象串行化为简单对象访问协议(SOAP)格式。当将对象参数传递到一个Web服务方法或从一个Web服务方法中返回对象时,SoapFormatter将对象串行化为SOAP格式用于传输,这是.NET为提供的简洁高效的分布式对象传送解决方案。,总之,.NET串行化机制可以在n层应用系统中,将对象串行化为XML格式来在系统各层之间传递对象数据。7.2对象的XML串行化要注意的是,串行化对象的类必须是一个公共类(Public),如果试图串行化一个非公共类,XMLSerializer将在运行时抛出一个异常。在类的内部将只串行化那些公有成员,非公有成员将不被串行化为XML。如果必须要串行化非公有成员,可以使用BinaryFormatter或SoapFormatter。7.3XML对象的并行化将串行化为xml的对象复原,则需要并行化xml数据对象。为此可以调用XmlSerializer对象的Deserialize方法来实现。如下例所示:,DimserializerAsNewXml.Serialization.XmlSerializer(GetType(book)DimreaderAsSystem.IO.StreamReader=NewSystem.IO.StreamReader(E:serializerbook.xml)DimaAsbook=CType(serializer.Deserialize(reader),book)reader.Close()Console.WriteLine(BookID:&a.BookID)Console.WriteLine(BookName:&a.BookName)Console.WriteLine(PrintEntertoExit)Console.ReadLine()运行情况如图813所示:,7.4XML串/并行化中的容错处理如果要处理意外节点,可以使用XmlSerializer的以下事件UnknownNode、UnknownElement、UnknownAttribute、UnreferencedObject进行处理,然后执行并行化过程:,另外,还可以灵活地控制串行化xml的格式,这样可以很方便地与外部应用程序进行交换对象。可以在类中加入.NET框架属性,如XmlRoot、XmlElement等,来控制串行化xml的格式。,7.5对象二进制形式的串行化除了可以将对象串行化为XML格式以外,还可以将其串行化为二进制、soap格式。一个类能够被串行化有两种方式:将此class简单地标记为Serializable为此class实现ISerializable接口,并将此class标记为Serializable。,7.6对象SOAP形式的串行化用类似的方法同样也可以将对象串行化为SOAP形式,使用SoapFormatter。串行化(Serialization)是.NET中一种实现对象持久性(Persistent)的机制。它是一个将对象中的数据转换成一个单一元素(通常是Stream)的过程。它的逆过程是并行化(Deserialization)。串行化的核心概念是将一个对象的所有数据看作一个独立的单元。一般说来,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论