《ASPWeb程序设计》第七章ASP与XML编程.ppt
第7章 ASP.NET与XML编程,近年来,XML由于适于异构应用系统间的数据共享,优越的数据存储机制,强大的数据检索能力等优点而被广泛应用。在实际的应用系统中,合理广泛地应用XML能给解决实际的应用难题提供极大的便利,因此,掌握XML的使用是很有必要的。通过对本章内容的学习以使读者快速掌握XML的优点、用途和使用方法。,本章要点,XML基本结构标记使用XMLReader读取XML数据使用XMLWriter写入XML数据XML数据验证XML数据显示,近年来,XML由于适于异构应用系统间的数据共享,优越的数据存储机制,强大的数据检索能力等优点而被广泛应用。在实际的应用系统中,合理广泛地应用XML能给解决实际的应用难题提供极大的便利,因此学习、理解、掌握XML的使用是很有必要的,本章内容意在让读者通过本章的学习,快速掌握XML的优点、用途和使用方法。,7.1 XML基本概念,XML基本结构文档的声明与处理指令标记,XML基本结构,XML文件由序言码、处理指令、根元素、元素、属性、CDATA和注解等几部分组成。1序言码序言码是XML文档的第一部分。序言码包括:XML声明、处理指令和架构声明,例如:。2处理指令处理指令是用来给处理XML文档的应用程序提供信息的,XML分析器把这些信息原封不动地,传给应用程序,有应用程序来解释这个指令,遵照它所提供的信息进行处理。格式如下:如:。根元素是XML文档的主要部分,它包含文档的数据以及描述数据结构的信息。例如:,3根元素根元素中的信息存储在两种类型的XML结构中:元素和属性。XML文档中使用的所有元素和属性都嵌套在根元素中。4元素元素是XML文档的基本构成单元,它用于表示XML文档的结构和XML文档中包含数据。元素包含开始标记、内容、和结束标记。由于XML区分大小写,所以开始标记和结束标记必须完全匹配。5属性属性是使用与特定元素关联的对应“名称值”的XML构造。例如:,6CDATA 在CDATA标记下,所有的标记、实体引用都被忽略,而被XML处理程序当作字符数看待。CDATA的形式如下:CDATA的文本内容不能出现字符串“”,另外,CDATA不能嵌套。,7注释XML文档可以包含注释,也可以没有。注释并不是由XML分析程序进行处理,但用于在文档的XML源代码中提供必要的说明。注释以“”结束。,文档的声明与处理指令,XML文档结构包含以下3个部分:(1)声明部分。声明该文档是一个XML文档。(2)定义部分。定义XML数据的类型以及所使用的DTD(可选)。(3)内容部分。用XML标签和注释标注过的文档类容。,XML文档以XML声明开头,声明本文档是一个XML文档。一般这样书写:定义符“”表示这是一条给XML解析器的处理指令。虽然声明这条语句是可有可无的,但考虑到以后的兼容,建议读者还是写上为好。随着语言的进一步发展,以后的浏览器如果知道文档所用的XML版本的话,将是有好处的。这些语句必须全部用小写。,在上面的声明中version表示的XML的标准版本号。encoding表示的是文档所用的编码。standalone用来指定在XML文档被解析之前,是否使用外部或内部DTD,它的值只能是yes或no。如果为no,表示使用外部DTD;如果为yes表示使用内部DTD;如果不使用DTD,则不使用这个属性。看下面的例子:,在XML声明之后,紧接着是类型定义部分,定义XML文档中数据的类型。DTD是用来定义XML文档内容的结构的,以便按统一的格式存储信息。DTD规定了XML文档中可以出现哪些元素,这些元素是必须的还是可选的,这些元素有什么属性;以及它们之间的相互位置关系等等。XML允许用户为自己的应用程序定义专用的DTD,这样用户就可以完全检查文档结构和内容的过程了。这一检验过程称为有效化,严格依从一个DTD的XML文档被称作有效文档。,创建DTD的过程与在数据库里创建数据表是类似的。在DTD中,用户定义用来表示数据的元素,然后规定数据的结构,并规定这个元素是可选的还是必须的,这就好比创建数据表的列;然后把数据存入XML文档,就好比添加数据表的记录。XML文档使用的元素可以在内部DTD中定义,也可以在外部DTD中定义。1.内部DTDDTD可以作为文档的一部分直接放到文档里面,这样的DTD只能用于包含它的这个文档,别的文档就不能使用了。创建内部DTD的语法如下:,!DOCTYPE标识文档类型定义的开始,属性rootelement指明跟元素名字。2.外部DTD外部DTD是一个单独的文件,存放XML文档中可以使用的全部元素及属性的定义。你可以在多个文档中同时使用同一个DTD,以便保持多个文档之间数据结构的一致性。在XML文档中引用外部DTD的语法如下:,其中,DOCTYPE标识这是文档类型定义部分;rootelement代表根元素;PUBLIC表示这个DTD是存放在公用服务器上的;SYSTEM表示这个DTD是存放在本地计算机系统上的;Name-of-file是被引用的DTD文件的名称。3.DTD字符DTD中使用的部分专用字符及其含义见表7-1。,4在DTD中定义元素元素是XML文件的基本组成部分。每个元素都是用标签标识的一小段数据。标签包括了元素的名字和属性。XML允许用于创建自己的元素集。因此,元素名应该取得容易记忆,并且最好有一定的含义,让人一看到它,便对里面的数据有个大概的了解。XML是大小写敏感的,所以要么你全用大写,要么就一律用小写。定义元素的语法如下:,5处理指令处理指令必须以称为目标的标识符开头,遵循的规则与元素名和属性名类似。处理指令目标区分大小写,并且必须以字母或下划线开头。目标的其他部分可以包含字母、数字、连字符、下划线、句点和冒号。任何有效的 XML 文本字符均可以出现在该目标之后。6样式表处理指令样式页处理指令的语法如下所示:,标记,标记的名称 标记的说明 标记的分类,1标记的名称票房的名称必须满足一定的规则,规则是:名称可以由字母数字、下划线(“_”)、点(“.”)或连字符(“-”)组成,但必须以字母或下划线开关。如果XML文件使用UTF-8编码,字母不仅包含通常的拉丁字母a、b、c等。也包括汉字、日文片假名、平假名、朝鲜文以及其他许多语言中的文字。票房名称区分大小字,例如:Hunter与Hunter是完全不同的标记。,2标记的说明XML文件必须有且仅能有一个根标记,其他标记都必须封装在根标记中。XML文件的标记必须形成树状结构。以下是一个不规范的XML文件,标记未形成树状结构,“性别”标记与“出生日期”标记有交叉。下面这个示例是错误的。男1983年2月6日,3标记的分类XML文件中的标记分为非空标记和空标记两种。(1)空标记所谓空标记就是不标记任何内容的标记。由于空标记不标记任何内容,所以空标记不需要开始标记和结束标记,空标记以“”标识结束,根据空标记是否含有属性,空标记的语法格式分别为:或,(2)非空标记非空标记必须由“开始标记”与“结束标记”组成,“开始标记”与“结束标记”之间是该标记所标记的内容。开始标记以“”标识结束,“”标识之间是标记的名称和属性列表,根据非空标记是否含有属性,开始标记的语法格式分别为:或需要注意的是,在标识“”的前面可以有空格和回车符。结束标记以“”标识结束,“”标识之间是标记的名称。需要注意的是,在标识“”的前面可以有空格和回车符。,7.2.NET中的XML类,使用XmlReader读取XML数据使用XmlWriter写入XML数据,使用XmlReader读取XML数据,XMLReader简介 XMLReader应用,1.XMLReader简介XmlReader是一种快速、无缓冲、向前并只读的游标,用于读取XML文档,并且隐藏了底层数据交换的复杂性。XmlReader作为一种“拉模型”,较“推模型”的SAX有了多种优势,最主要的一个就是它更易使用,其次性能更为提高、并减少了编程的难度。XmlReader类是一个抽象类,XmlTextReader,XmlValidatingReader,和XmlNodeReader类都继承自XmlReader类。XmlReader类有很多方法和属性用来读取XML文件的内容、查找XML元素的深度、判断当前元素的内容是否为空,以及导航XML的属性等。,2.XMLReader应用在.NET构架中,XML类均被定义在System.Xml名称空间中,如:XmlReader、XmlTextReader、XmlValidatingReader、XmlNodeReader、XmlWriter、和XmlTextWriter,因此使用XmlReader时应该引入System.Xml。.NET的XmlReader提供了一种访问XML数据的良好接口,让开发人员更为轻松的读取XML文件中的内容,使得快速应用.NET成为可能。,使用XmlWriter写入XML数据,XmlWriter简介 XmlWriter应用,1.XmlWriter简介 类似于XmlReader,.NET Framework也提供了一个快速、非缓存、只向前的方式动态写入XML数据的类,即XmlWriter类。完全可以将XmlWriter对象理解为XmlReader对象的对等对象。请注意XML文档不是字符串,不要试图使用操作字符串的方式操作XML。,2.XmlWriter应用XmlWriter 类将 XML 数据写入流、文件、TextReader 或字符串。通过该类可以以只进、只写、非缓存的方式创建格式正确的 XML 数据。XmlWriter 类支持 W3C XML 1.0 和 XML 中的命名空间的建议。,7.3 XML数据验证,默认情况下,在文档对象模型(DOM)中,XmlDocument 类不针对 XML 架构定义语言(XSD)架构或文档类型定义(DTD)验证 XML;只验证 XML 的格式是否正确。要在 DOM 中验证XML,可以在XML加载到DOM时进行验证,方法是将架构验证XmlReader 传递给 XmlDocument 类的 Load 方法,也可以在 DOM 中使用XmlDocument类的 Validate方法来验证以前未经过验证的XML文档。在 XML 文档加载到 DOM 时进行验证 在 DOM 中验证 XML 文档,1.在 XML 文档加载到 DOM 时进行验证如果将验证 XmlReader 传递给 XmlDocument 类的 Load 方法,XmlDocument 类将在 XML 数据加载到 DOM 时对其进行验证。我们通过创建 XML 架构验证 XmlReader来对XML文档在加载期进行验证,其创建步骤如下:(1)构造一个新的 XmlReaderSettings 实例。(2)将 XML 架构添加到 XmlReaderSettings 实例的 Schemas 属性中。(3)将 Schema 指定为 ValidationType。(4)可以选择指定 ValidationFlags 和 ValidationEventHandler,用于处理在验证期间遇到的架构验证错误和警告。(5)最后,将 XmlReaderSettings 对象与 XML 文档一起传递给 XmlReader 类的 Create 方法,创建架构验证 XmlReader。,2.在 DOM 中验证 XML 文档.Net程序集System.Xml包含了许多类,这些类用于在.NET平台上提供Xml功能。XmlValidatingReader类(XmlReader类的一种实现)就是其中的一种。在将xml文档或Xml片段读入系统时,该类提供验证支持。它实现 DTD、XML 数据简化(XDR)架构和 XML 架构定义语言(XSD)架构等规范所定义的有效性约束。(1)构造XmlValidatingReade类对象实例 初始化XmlValidatingReader类的新实例有多种方法,最常用的一种是传入XmlReader类型的参数:public XmlValidatingReader(XmlReader reader);XmlValidatingReader vReader=new XmlValidatingReader(XmlTextReader xtr);,(2)指定验证类型 有三种规范用于对xml文档执行验证。它们是DTD、XDR及XmlSchema。所以,在执行验证之前,需要确定验证的类型,这通过设置ValidatingReader类的ValidationType属性来完成:vReader.ValidationType=ValidationType.Schema.这行代码将验证声明为XSD Schema。,(3)使用XmlSchemaCollection类缓存架构 如果需要根据XDR或者XSD Schema进行验证,可以使用XmlSchemaCollection类来缓存架构,这样将可以提高性能。XmlSchemaCollection类的Add方法加载架构,同时,架构会与命名空间 URI 关联。对于XML 架构的源文件(.xsd)来说,这通常会是架构的 targetNamespace 属性。XmlSchemaCollection xsc=new XmlSchemaCollection();Xsc.Add(http:/;,vschema.xsd);当然,如果架构内联于XML文档中,就不需要这样做了。,(4)关联架构缓存 在向XmlSchemaCollection中添加完schema之后,XmlValidatingReader并不能自动识别并使用schema,还需要将两者关联起来。通过使用读取器的 Schemas 属性引用缓存在 XmlSchemaCollection 中的架构文件来完成这一过程:vReader.Schemas.Add(xsc);,(5)ValidationEventHandler事件处理程序回调 在使用ValidatingReader执行验证读取Xml文档时,可能发生意外。这时,可以通过ValidationEventHandler 回调报告验证错误和警告。ValidationEventHandler 事件用于设置一个事件处理程序以接收有关文档类型定义(DTD)、数据简化 XML(XDR)和 XML 架构定义语言(XSD)架构验证错误的信息。,(6)执行验证读操作 做完以上准备工作后,你可以使用XmlValidatingReader类的读方法开始验证读取Xml文档了。可以是 Read、ReadInnerXml、ReadOuterXml 中的任一种以及其他将改变接点的方法,如Skip()方法。这时,都将发生验证。While(vReader.Read()/处理读取的内容,7.4 XML数据显示,XSL基本概念 XSL实例,XSL基本概念,XSL(eXtensible Stylesheet Language,可扩展样式语言)是为XML文件定义的一种标识语言,它将提供远远超过CSS的强大功能,如将元素再排序等。实际上简单的XML已可被CSS所解释,然而复杂的高度结构化的XML数据或XML文档则只能依赖于XSL极强的格式化能力而献给用户。XSL是一种解释机制。它将某个来源的原XML数据结构解释或转换为另一个来源可以理解的数据结构。此外,XSL还可用于根据接收者的要求来更改信息的XML展示方法。,XSL实例,本示例加载了一个XSL样式表,将一个称为XMLFile.xml的文件读入到XPathDocument中,并对一个称为XSLTFile.xsl的虚构文件上的数据执行转换,将格式化输出在页面上。示例中使用的XML文件为“XMLFile.xml”,其代码为:张三 20 负责软件产品研发,李四 20 负责市场开拓,市场调研 使用的格式化文件为“XSLTFile.xsl”,其代码为:,没有发现任何领导,新建一个ASP.NET页面,页面名称为“userxslt.aspx”,然后在“”文件中添加如下代码:using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using;using;using;using;using;using System.Xml;using;using;,public partial class Default2:/定义两个文件常量 private const String filename=XMLFile.xml;private const String stylesheet=XSLTFile.xsl;protected void Page_Load(object sender,EventArgs e)/构造XslTransform对象 XslTransform xslt=new XslTransform();/利用XslTransform对象的load()方法加载XSLT格式文件 xslt.Load(Server.MapPath(stylesheet);/构造XPathDocument对象,XMLFile.xml内容将被XPathDocument对象所解析 XPathDocument xpathdocument=new XPathDocument(Server.MapPath(filename);,/构造XmlTextWriter对象,并且指定输出调用/Response.Output输出页面 XmlTextWriter writer=new XmlTextWriter(Response.Output);writer.Formatting=Formatting.Indented;/将XMLFile.xml文件按XSLTFile.xml指定的格式输/出到页面上 xslt.Transform(xpathdocument,null,writer,null);编译执行“userxslt.aspx”,执行后的结果如图所示。,7.5 实例(写入并读取XML数据),案例目标 实现思路 案例演示 案例文件功能列表 保存联系人信息到XML文件中在ASP.NET中读取XML 在ASP.NET中写入XML文档,案例目标,通过本案例的实现过程的介绍,让读者基本熟悉在ASP.NET中读写XML文件的基本方法。,本章小结,本章介绍了关于XML的基本概念,比较详细地介绍了一个XML文件的各个元素,着重介绍了在ASP.NET中读写XML文件的方法,并用一个实例:XML通讯录,比较详细地介绍了在ASP.NET中使用XmlNode类、XmlDocument类、XmlTextReader类、XmlTextWriter类等操作XML文件的方法。,本章结束,谢谢!,