• 1. 第6章 基于. NET的XML编程技术 6.1 关于.NET 6.2 .NET框架 6.3 .NET框架对XML文档的支持 6.4 .NET框架的XMLDOM解析器 6.5 .NET框架的XML阅读器 6.6 .NET框架中的XML数据管理 6.7 XML的串行化 6.8 XSLT转换
  • 2. 6. 1 什么是.NET自微软2000年6月在“论坛2000”上向全球正式推出了Microsoft .NET以来,Microsoft .NET就成为整个IT业界最为关注的话题,越来越多的应用已经开始建立在.NET这种新的体系结构之上,并迅速成为信息化应用的潮流与方向。 .NET分为三个主要部分:.NET战略、.NET 框架、.NET企业服务器。 .NET战略:该战略是基于这样一种想法,即所有的设备将来会通过一个全球宽带网(即Internet)连接在一起,同时所有的软件都将成为在该网络上提供的一种服务。
  • 3. .NET 框架: 是指像ASP.NET这样可使.NET更加具体的新技术。该架构提供了具体的服务和技术,以便于开发人员创建相应的应用程序以支持如今连接岛Internet上的用户的需求。 .NET企业服务器:是指像SQL Server2000 和BizTalk Server2000 这样的由.NET 框架应用程序使用的服务器产品,不过目前它们并不是使用.NET 框架编写成的。这些服务器产品将来的版本都将支持.NET,但不必使用.NET重新编写它们。
  • 4. 6. 2.NET框架.NET 框架是.NET的重要组成部分,是一个开发、部署和运行.NET应用的环境。包括了ASP.NET、公共语言运行时环境CLR以及.NET 框架类。它由以下4个主要部分组成:
  • 5. 应用程序开发技术 类库 基类库 公共语言运行时环境(CLR)
  • 6. 6. 3 .NET框架对XML文档的支持在.NET应用程序内处理XML文档时所用的一些主要的对象。
  • 7. 基于DOM的方式——System.Xml含有一组将XML文档作为数据的对象。该数据可以通过XML文档树的节点、元素和属性等实体来访问。XML的这种生成和浏览方式非常灵活,但它比不上基于流的XML生成和浏览的性能。将这种方式称为XMLDOM分析器。 基于流的方式——System.Xml中含有许多类,可以读取XML和写XML到一个流中,由于它表示的是一系列的读和写,所以使用这种方法可以快速的使用或生成一个XML文档。使用该方法的局限性在于它并不将XML数据作为由有形实体如节点、元素和属性组成的文档。 称这种方式为XML阅读器。
  • 8. .NET框架中支持DOM的类主要存在于System.Xml和System.Xml.XmlDocument名字空间中。这些类分为两个层次:基础类和扩展类。基础类提供了Core DOM Level 1 标准中用来描述底层的基础接口的集合的特性,这些基础接口可以用来表示任何结构化的文档,更特别地,它们可以被用来定义表示一个XML文档所需要的扩展接口。扩展类实现了Core DOM Level 1中的所有基础接口和Core DOM Level 2 中定义的其他接口。 在基础类层次中,.NET类库包含了三个类: ●XmlNode类:用来表示文档树中的单个节点,该类具有各种方法和属性,支持对XML节点的各种操作。这是一个抽象基类,在扩展类层次中会有这个基类的其他具体派生类的实现;6. 4 .NET框架的XMLDOM分析器
  • 9. ● XmlNodeList类:用表示一个节点的有序集合,它提供了对迭代操作和索引器的支持。 ● XmlNamedNodeMap类:用来表示一个节点的集合,该集合中的元素(即节点)可以使用节点名或索引来访问,支持了使用节点名称和迭代器来对属性集合的访问,并且包含了对名字空间的支持。 扩展类层次包括了众多的类,主要的类有以下几个,它们都是由XmlNode类派生出来的: ● XmlDocument——该类对应于一个完整的XML文档,使用Load方法可以加载XML文档,也可以从文件(文件名被指定为String类型)或通过TextReader或XmlReader,使用LoadXm和包含XML文档的字符串来加载XML文档。 ● 要存储XML文档,使用Save方法可以存储格式文件(文件名被指定为String类型)、TextWriter和XmlWriter。
  • 10. ● XmlElement——该类表示文档中的一个元素对象。该类中的函数包含许多方法,关于操作元素的属性:GetAttribute、GetAttributeNode、RemoveAllAttributes、RemoveAttributeAt、RemoveAttributeNode、SetAttribute和SetAttributeNode。这些方法是XmlElement支持的元素特有的子集。 ● XmlAttribute——该类表示XmlElement对象的一个属性。属性包含数据和下一层级的数据列表,因此它比XmlNode或XmlElement更简单。XmlAttribute获取它自己的文档、元素、父节点,名称。 ● XmlAttributeCollection——该类表示了XmlElement对象的属性集合。 ● XmlComment——该类表示XML文档中的注释内容 ● XmlDeclaration——该类表示XML的声明节点 ● XmlDocumentType——该类表示XML文档的DOCTYPE声明节点
  • 11. ● XmlEntity——该类表示XML文档中一个解析过或未解析过的实体 ● XmlEntityReference——该类表示一个实体引用 ● XmlText——该类表示了一个元素或属性的文本内容 例子9.1
  • 12. 使用DOM处理XML.NET Framework中DOM类的继承结构
  • 13. 使用DOM加载及保存XML数据 首先,初始化XmlDocument对象,例如: XmlDocument doc = new XmlDocument(); 然后,调用Load()方法加载文件、流、XmlReader对象或TextReader对象中的XML数据,例如: doc.Load("C:\\BookData.xml"); 或者调用LoadXml()方法加载字符串中的XML数据,例如: doc.LoadXml("" + "Pride And Prejudice" + ""); 使用XmlDocument对象中的Save方法可以将XML数据保存到一个XML文件中或是一个流对象、一个TextWriter对象、一个XmlWriter对象中。   Save() 方法的语法如下: XmlDocument.Save(filename | Stream | TextWriter | XmlWriter)
  • 14. 使用DOM浏览XML 创建并使用一个XmlNode对象在XmlDocument对象中浏览、创建或修改节点。(例XmlNodeDemo) 通过使用XmlNode对象及其派生类的属性,就可以返回有关XML源文档内容的信息。(例xmlNodePropertyDemo) 要想引用XmlDocument对象中的单个节点,可以使用调用SelectSingleNode()函数的方法或使用XMLNode类的浏览属性。 (例XmlNodeSelectDemo1) 可以创建XmlElement对象来解析XmlDocument对象中的元素和属性的信息。(例GetAttributeDemo,GetEnumeratorDemo) XmlNodeList类表示XmlNode的有序集合 (例XmlNodeListDemo) 可以使用XmlNamedNodeMap对象保存一个元素节点的属性集合 (例XmlNamedNodeMapDemo)
  • 15. 创建新节点步骤: 1、从XML数据源创建和加载XmlDocument对象 2、在原始文档中定位新节点的插入位置 3、创建新节点,此节点可以使任何类型的节点。 4、把新节点添加到XmlDocument对象中例CreateTextNodeDemo
  • 16. 添加节点时调用的方法 XmlNode.AppendChild 添加到当前节点的子节点列表的末尾 XmlNode.InsertBefore 添加到紧接着插入指定的引用节点之前 XmlNode.InsertAfter 添加到紧接着插入指定的引用节点之后
  • 17. 修改和删除节点 首先定位要操作的节点 通过设置XmlElement对象的 InnerText属性或通过调用XmlNode.ReplaceChild()方法替换整个节点的方式来修改节点值 也可以通过调用XmlElement.SetAttribute()方法来修改属性节点。 要删除XmlDocument对象中的节点,可以通过调用XmlNode.RemoveChild()方法来进行实现元素的移除, 如果要删除属性的话,我们可以通过调用XmlElement.RemoveAttribute()方法来实现属性节点的移除 也可以通过调用XmlNode.RemoveAll()方法移除所有的子节点,
  • 18. 6. 5 .NET框架的XML阅读器 除了DOM外,XML另一种对数据访问的接口是SAX(Simple Application for XML)。.NET 框架虽然不支持SAX分析器,但提供类似SAX分析器的功能。在.NET 框架中,XML阅读器模拟了SAX的功能。通过XML阅读器,SAX的所有的功能都能很容易的实现并得到更有效的运用。与SAX分析器不同的是,.NET 框架的阅读器整个都运作在客户端应用程序下面。这样,应用程序本身就可以只把真正需要的数据“pull out”,然后从XML数据流中跳出来。
  • 19. XML阅读器支持一个编程接口,该接口用于连接XML文档。阅读器工作原理类似于的桌面应用程序从数据库中取出数据的原理。数据库服务返回一个游标对象,它包含所有查询结果集,并返回一个引用,该引用指向目标数据集的开始地址的引用。XML阅读器的客户端收到一个指向阅读器实例的引用。该实例提取底层的数据流并把取出的数据呈现为一棵XML树。阅读器类提供只读、向前的游标,可以用阅读器类提供的方法滚动游标遍历结果集中的每一条数据。 从阅读器中看XML文档不是一个标签文本文件,而是一个串行化的节点集合。它是.NET 框架中的一种特殊的游标模式,也是.NET 框架中一个独特的API函数。 阅读器和XMLDOM分析器的不同之处在于,XML阅读器是只进的,它没有父、子、祖宗、兄弟节点的概念,而且是只读的。
  • 20. 在.NET 框架中,System.XML.XMLWriter和System.XML.XMLReader这两个抽象类为.NET的pull model提供了XML支持,分别用来完成读写XML文档的功能。因此,可以用XmlReader和XmlWriter类直接处理XML数据。
  • 21. 6.5.1 XmlReader类XmlReader对输入流进行XML包装。Read方法可以快速地遍历一份文档,它只能向前,而不能向后。可通过Value属性返回文档当前节点的内容。 XmlReader对XML文档默认采用深度优先遍历。 使用时,常使用XmlReader的继承类 XmlTextReader XmlNodeReader XmlValidatingReader
  • 22. 1)XmlTextReader-对xml文档的基本解读XmlTextReader是XmlReader的子类,提供了解读xml最基本的支持。XmlTextReader类用只进、只读的方式快速访问xml数据流。 示例e9_2
  • 23. XmlNodeTypeAttribute CDATA Comment Document DocumentFragment DocumentType Element EndElement EndEntity Entity EntityReference None Notation ProcessingInstruction SignificantWhitespace Text Whitespace XmlDeclaration
  • 24. 2)XmlNodeReader-基于节点的解读XmlTextReader访问指定xml流中所有节点,XmlNodeReader类用于访问XmlDom子树的所有节点。 例e9_6
  • 25. 3)XmlValidatingReader-有效性检查XmlValidatingReader继承了XmlReader类,支持多种类型的XML验证:DTD、XML-Data Reduced(XDR)架构及XSD。 可用于检验XML文档和XML片段的有效性。 例 e9_7
  • 26. 6.5.2 XmlWriter类XmlWriter创建Xml文档。以只向前(forward-only)的方式输出xml数据到流或文件中。 XmlWriter在设计时就保证了所有的xml数据都符合W3C XML 1.0推荐规范。 XmlTextWriter是.Net框架中XmlWriter唯一的一个继承类,用于输出xml文件。 例 e9_8
  • 27. 6.6 .NET框架中的XML数据管理.NET对XML的支持还涉及到.NET对关系型数据的支持,因为XML是.NET数据访问类中保存数据的标准格式。 实际上,在.NET 框架中,XML确实是所有数据存储和串行化的基础。其中,不再有MIME编码的记录集对象或者COM对象,它们都是以自己特定格式保存数据的。
  • 28. DataSet对象就是一个很好的例子。将它看作一个用来存放一个或多个数据表的容器(这有点像多个记录集对象的封套)。在需要使用相关技术访问数据时,这种方法非常合理。DataSet可以将其内容保存到磁盘文件中,或者是写到像Stream这样的其他对象中。此时数据的格式为XML。 本节内容将着重介绍XML和DataSet对象间的相互转换。 6.6.1 数据从DataSet到XML的转换 将数据从DataSet输出为XML时,有两种基本处理方法: 将数据放到元素中作为文本内容 每个数据行都用一个单独的元素,并将数据本身放到该元素的属性中
  • 29. 第一种方法是使用数据项来作为元素的一个分层结构的文本内容,具有较好的可读性。但是由于这样有较多的标记(也就是元素标记),于是会生成一个更大的文档。第二种方法将数据放到元素的属性中,虽然使生成的文档较小,但在使用诸如DOM这样的其他XML方法来访问内容时,可能会比较困难。 例子e9_10 XML与DataSet转换的工具——XmlDataDocument对象 在上面的介绍中,已经知道了可以用XmlDocument对象和XPathDocument对象来存储和处理XML数据。在这里,将介绍另一种文档对象的实现方法——XmlDataDocument对象。 DataSet为从关系数据集到XML文档和XML模式的传输及其反向传输提供了一种极好的工具支持。利用XmlDataDocument对象,可实现数据从XML到DataSet的转换。在DataSet中修改数据不仅更为便捷,还可保证该数据在XML形式中的更改同步实现。
  • 30. XmlDataDocument对象是对XmlDocument对象的扩充,它提供一套相同的属性和方法。然而,它也起着联系XML和关系型数据访问方法的“桥梁”的作用。在用XML文档装载数据时,该对象就能将该文档以DataSet对象的形式展现出来。这就使得不但可以使用关系型数据编程技术来处理这些数据,还可以用XmlDocument对象中的XML DOM技术来执行该操作。 XmlDocument和XmlDataDocument对象的惟一真正的外部区别就是,后者有几个附加属性和方法。其中最有用的就是名为DataSet的属性。它会返回一个对象的引用,该引用指向一个XML文档中的数据,但所看到的则是一个DataSet。这个属性是只读的。
  • 31. 图9-7可以使对XmlDataDocument的工作方式有一个初步了解。
  • 32. 能够通过各种Reader对象(如XmlNodeReader,XmlTextReader等)来访问XML文档,还可以将文档加载到一个DataSet中。 但是,在将XML加载到一个XmlDataDocument对象之后,就可以引用一个包含相同数据的DataSet对象,这相当于将数据读入了那个DataSet中。而且,无论改变DataSet还是XmlDataDocument中的数据,两者都会发生相应变化。它们是完全自动同步的。实际上,得到的是同一数据的两种不同显示方式而已,就像上图所示那样。 这意味着这两种数据(关系数据或者XML数据)之间再也没有差别,它们只是同一数据的两种显示方式。 所以一旦得到了XmlDataDocument中的数据,就可以随意选择用关系数据库中针对DataSet的方法,或者用.NET中处理XML的方法来访问该数据。 例子e9_11的几个例子
  • 33. 6. 7 XML的串行化 1.串行化概述 串行就是获取一个对象并将它转换成一种它可以在网络上传输或者输送到某个存储单元的格式的过程。存储单元就像是一个文件或者数据库那么简单。串行的格式包含对象的状态信息。非串行就是使用串行的状态信息将对象从串行状态还原成原始状态的过程。从本质上说,串行过程允许对象被远程调用在网络上运载或者输送到某个存储单元(如ASP.NET缓存区),并可以在以后的应用中被及时使用和及时重建。 .NET 框架 对创建分布式应用程序和服务提供了广泛的、可扩展的支持。当创建一个分布式系统时,一个必须要解决的问题就是如何实现将对象从系统的一部分传送到另一部分。
  • 34. .NET 框架 中的XmlSerializer 类提供了串行化的方法, 它使能够将自己的对象串行和反串行化为XML。它存在于System.Xml.Serialization命名空间的System.Xml.dll中, 用一种高度松散耦合的方式提供串行化服务。 串行化机制的可定制性很强,因此可以很灵活地控制对象串行化为XML的格式(如:可以用XSD模式来定义在串行化过程中产生的XML文档结构)。 除了串行化为XML以外还有BinaryFormatter和SoapFormatter格式化类。BinaryFormatter将对象串行化为二进制格式。这样可以高效地传输到远程应用程序。SoapFormatter将对象串行化为简单对象访问协议(SOAP)格式。 当将对象参数传递到一个Web服务方法或从一个Web服务方法中返回对象时,SoapFormatter将对象串行化为SOAP格式用于传输,这是.NET为提供的简洁高效的分布式对象传送解决方案。
  • 35. 总之,.NET串行化机制可以在n层应用系统中,将对象串行化为XML格式来在系统各层之间传递对象数据。 2.对象的XML串行化 要注意的是,串行化对象的类必须是一个公共类(Public),如果试图串行化一个非公共类,XMLSerializer将在运行时抛出一个异常。在类的内部将只串行化那些公有成员,非公有成员将不被串行化为XML。如果必须要串行化非公有成员,可以使用BinaryFormatter或SoapFormatter。 例子9.12 3.XML对象的反串行化 将串行化为xml的对象复原,则需要并行化xml 数据对象。为此可以调用XmlSerializer对象的Deserialize方法来实现。
  • 36. 4.XML串/并行化中的容错处理 如果要处理意外节点,可以使用XmlSerializer的以下事件UnknownNode、UnknownElement、UnknownAttribute、UnreferencedObject进行处理,然后执行并行化过程。 5.对象二进制形式的串行化 除了可以将对象串行化为XML格式以外,还可以将其串行化为二进制、soap格式。 一个类能够被串行化有两种方式: 将此class简单地标记为Serializable 为此class实现ISerializable接口,并将此class标记为Serializable。 例子9.16
  • 37. 6.对象SOAP形式的串行化 用类似的方法同样也可以将对象串行化为SOAP形式,使用SoapFormatter。 例子e9_18 7.小结 串行化(Serialization)是.NET中一种实现对象持久性(Persistent)的机制。它是一个将对象中的数据转换成一个单一元素(通常是Stream)的过程。它的逆过程是并行化(Deserialization)。串行化的核心概念是将一个对象的所有数据看作一个独立的单元。 一般说来,在两种情况下非常需要串行化: 1)  当希望能够将对象当前的状态完整地保存到存储介质中,以便以后能够精确地还原对象时 2)  当希望将对象从一个应用程序空间(Application domain)传递到另一个应用程序空间时。
  • 38. .NET 框架通过Reflection提供自动串行化的机制。当一个对象被串行化的时候,它的类名,Assembly,以及类实例的所有数据成员都将被写入存储介质中。 Serialization引擎保持对所有已经被串行化的对象引用的追踪,以确保相同的对象引用最多只被串行化一次。
  • 39. 9. 8 XSLT转换XSL和XSLT,尽管看上去很像,但它们并不源于同一个W3C规范。XSL(the Extensible Stylesheet Language),可扩展样式语言,它本身是一种简单的语言,用来表示样式表。XSL和CSS很类似,但它们所遵循的语法并不相同。而事实上,XSL与CSS2有许多共同的属性。
  • 40. XSLT的英文标准名称为eXtensible Stylesheet Language Transformation,它是XSL的一个子集。根据W3C的规范说明书(http://www.w3.org/TR/xslt),最早设计XSLT的用意是帮助XML文档转换为其它文档。但是随着发展,XSLT已不仅仅用于将XML转换为HTML或其它文本格式,更全面的定义应该是:XSLT是一种用来转换XML文档结构的语言。 虽然,XSL与XSLT是不同的概念,但人们经常会把它们混淆起来。可以看到在.NET 框架中,微软也把.NET XSLT的命名空间叫做System.Xml.Xsl。 XSL-FO或者叫做XSL格式化对象,对XML的内容提供了更丰富,更复杂的格式化方法。
  • 41. (本页无文本内容)
  • 42. 1.转换XML文档 Dim source As String = "……" Dim destination As String = "……" Dim stylesheet As String = "……" Dim transform As New XslTransform() transform.Load(stylesheet) transform.Transform(source, destination) 2.将样式表与XML文档关联 使用xml-stylesheet处理指令(processing instruction),形式如下:
  • 43. 可以在XML源文档中随意使用这条处理指令,但是并不是任何XSLT处理器都可以对这条处理指令进行处理。比如,.NET中的XslTransform就不能自动识别上述xml-stylesheet处理指令,对此可以利用xml-stylesheet指令中所包含的信息,作处理。 3.在程序中处理样式表 .NET中将XSLT样式表看成一个XML文档,因而可以使用处理XML文档的方法,同样来创建和操作样式表。