数据的组织方式1:XML.ppt
第十章 数据的组织方式:XML,主要内容:概述、语法命名空间、XML SchemaXML DOM强大的检索工具:XPath格式化XML工具:XSL在客户端格式化XML跨浏览器的XML开发框架:zXML应用实例:Ajax文章列表程序(XML)重点、难点:全部,10.1 XML概述XML是Extensible Markup Language的简称,即可扩展标记语言。XML是从SGML和HTML发展而来的。XML有很多的优点,由于HTML语言的标签是固定不变的,注意就限制了他的发展,同时也带来了很多不便,由此就产生了可扩展标记语言XML,它能够实现扩展,解决了HTML的不足。XML有以下特点:XML是一种元标记语言,开发者可随意定义自己需要的标记。XML是一种语义/结构化语言,它描述了文档的结构和语义。XML是一种通用的数据格式,其表示的数据是独立于任何平台,任何语言的。它提供了一种规范,利用这种规范,任意平台上的任意应用程序之间都可以进行通信。下面是xml的示例代码:,第十章 数据的组织方式:XML,10.1 XML概述 Ajax tony 2010-10-10 hello boy Ajax tony 2010-10-10 hello boy,第十章 数据的组织方式:XML,10.2 XML语法规范XML是一种元标记语言,它允许开发者使用自定义标签,给开发者提供了极大的自由发挥空间,但是XML本身却有着非常严格的语法规范。开发者必须熟悉这些规范,才能正确使用XML。下面我们来了解下它的语法规范:XML声明:声明了该xml的版本,以及它的编码格式。根节点:xml文档中有且只有一个根节点。然后根节点下面可以有任意个子孙节点。,第十章 数据的组织方式:XML,10.2 XML语法规范开始标签和结束标签:Ajaxtony用开始和结束来包含其下面的子节点,当该节点没有子节点的时候我们也可以省去结束标签。这样写也是可以的,但是该元素没有子节点了。,第十章 数据的组织方式:XML,10.2 XML语法规范属性:节点是可以包含它的属性的,例如上面的level就是note节点的属性。合理的嵌套包含不允许元素之间交叉包含,例如下面的代码是错误的:Ajaxtony 这样写才是正确的:Ajaxtony,第十章 数据的组织方式:XML,10.2 XML语法规范大小写敏感:上面的两个标签不等同,由于XML大小写敏感,XML将认为这些是两个标签。空白被保留:Xml:“Hello world”结果:“Hello world”HTML:“Hello world”结果:Hello world”如果html里面写了多个空格,那么空格只会保留一个,而xml中会保存所有的空格。,第十章 数据的组织方式:XML,10.2 XML语法规范XML的注释:Xml的注释语言使用两个标记来扩住。元素的命名:Xml元素的命名也是要遵循一定的规范的,就象变量的命名一样,都有一个命名规范:元素名称可以包含字母,数字和其他字符,但是不能以数字或者标点符号开头。不能以xml(包括大小和大小写组合都不行)开头元素的名称不能包含空格,第十章 数据的组织方式:XML,10.2 XML语法规范元素的命名:下面的命名是错误的:下面的命名是正确的:,第十章 数据的组织方式:XML,10.2 XML语法规范转移字符:在xml中“”两个字符,解析是无法识别的,所以如果在字符窜中出现这两个字符,我们就需要使用转移字符来代替。下面是转移字符对应表:一般情况下,“”的转移字符最为常用。,第十章 数据的组织方式:XML,10.2 XML语法规范CDATA部件:当某个节点内包含大量的需要转义的字符时,我们可以使用CDATA部件来包含这些需要转义的字符。例如:b)alert(b);else alert(a);,第十章 数据的组织方式:XML,10.3 XML命名空间在XML中有可能出现同样的标签,来代表不同的意义。例如:上面的两段xml代码,第一个用来表示包里面放的有什么东西;第二个用来表示包的相关属性。有时候我们确实需要这样去定义。但是在xml中这样处理是错误的,为了解决这样的问题,我们就需要用到命名空间。,第十章 数据的组织方式:XML,10.3 XML命名空间定义如下:示例代码:C和p表示的就是命名空间,xmlns就是用来定义这个命名空间的。,第十章 数据的组织方式:XML,10.3 XML命名空间当然,你在定义这些命名空间的时候,不要起同样的名字。c和p不一样,而且命名空间指向的url地址也不能一样:两个地址显然不同。注意,有人会问,这个地址是不是必须是百度呢?不是这样的,地址你可以随意的起,即使该地址不存在,只要两个地址不一样即可。,第十章 数据的组织方式:XML,10.3 XML命名空间我们也可以为一个标签起两个命名空间:这样做也是可以的,但是不常用,作为了解。还有一种是默认的命名空间。我们留意下新建的一个html页面的代码,你就明白了。,第十章 数据的组织方式:XML,10.4 XML SchemaXML Schema到底是什么?假设我们现在正在做一个网页,页面上要求用户输入产品的编号和价格。试想下,如果用户输入价格时,输入的是汉字,那么我们怎么能把一个汉字转化成数字呢?所以,我们就需要用验证的方式,去提示用户,不能输入数字以外的字符。同样的道理,如果我们用xml保存一个产品的价格,例如:80.88 那么,如果这里存放的80.88被写成一串汉字,就非常危险了,在我们处理xml数据的时候,会给我们带来很多麻烦。所以,在xml中我们也需要一种约束来规范数据的格式,那么这种约束就是:XML Schema。,第十章 数据的组织方式:XML,10.4 XML Schema基本示例:(注意,Schema本身也是一个xml文档),第十章 数据的组织方式:XML,10.4 XML Schema系统需要对输出的XML文档进行以下约束:根元素Notes 下包含0个或者多个 note子元素Note元素有一个可选熟悉 postDate,其为日期类型,如果没有提供,则默认日期为:2007-11-17Note元素的第一个子元素必须为title,title元素不包含任何属性和子元素,其值必须是字符串类型(表示标题)Note元素的第二个子元素必须为summary元素,summary元素不包含任何属性和子元素,其值必须是字符串类型(表示简介)Note元素的第二个子元素必须为comment元素,comment元素不包含任何属性和子元素,其值必须是字符串类型(xx)Note元素的下一个元素为comment元素,为可选项,但是出现次数不能超过一次。comment元素不包含任何属性和子元素,其值必须是字符串类型(表示评论)在comment元素后,必须有一个或多个author元素(表示作者),第十章 数据的组织方式:XML,10.4 XML Schema系统需要对输出的XML文档进行以下约束:Author元素必须有一个表示作者姓名的name子元素,其值为字符串。另外还可以有两个可选的子元素:表示作者性别sex和年龄age。如果出现sex元素,则只能从male和female中选择一个取值。如果出现age元素,取值范围:20-80(包含两边),name,sex,age三个元素顺序不限。注意,作者可以有多个,也就是author元素可以写无数个。可以有一个tags属性,表示标签名称。Author之后(如果有tags元素,就是tags元素之后),有一个表示文章点击量的hit元素,该元素为可选,最多出现一次。取值范围=0,默认为0。hit元素之后,必须有一个表示文章地址的url元素,其值为字符串,但必须以开头,而且最后的文件后缀必须是html或者htm,第十章 数据的组织方式:XML,10.4 XML Schema我们就需要建立一个Schema,以下为示例:,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:下面,我们来尝试着去完成上面题目的要求:1.根元素Notes 下包含0个或者多个 note子元素要想完成这个要求,我们必须得先了解,在Schema中,定义元素是如定义的,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:定义元素:xs:命名空间element定义标签为元素name元素名称type元素类型,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:定义元素:我们必须要给元素名称,这个没问题:我们需要的元素名称是:nodes我们必须要给元素类型,现在又遇到了难题,怎么定义元素的类型呢?思考下,我们曾经所学过的一些数据类型:Int,string,date等等。那么,在Schema中是否也存在这些类型呢?下面,我们来了解下Schema中的元素类型如何定义:,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:内置类型:和我们想象的一样,Schema为我们提供了丰富的数据类型,由于这些类型比较多,这里我们就不一一列举出来了。常用的内容类型,如课本276页:String:字符串,int:数字 这里就不一一列出,详见课本。,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:好了,既然知道了内置数据类型,那我们现在可以定义了notes元素了吧?现在问一个问题?Notes元素是什么类型的?我们查看xml代码发现,notes不是某一个我们已知的类型,它下面有子元素,子元素下面可能还有子元素,并不是一个单一的节点,里面包含字符或者是数字。那么,notes元素到底应该是什么类型呢?Schema为我们提供了符合数据类型,来定义这些有子元素的节点的复杂元素下面,我们来了解下什么是复合类型:,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:复合类型:使用以上代码,我们可以定义一个符合类型,类型名称是notes。好了,既然复合类型已经定义完成,下面我们就来试试代码吧:,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:写好了代码,我们需要测试下是否书写规范,那么怎么测试呢?下面,我们要了解下,如何让xml和Schema一一对应:例如,我们建立了一个Schema:,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:上面的代码,就是我们已经建立好的Schema,注意xs:schema元素里面有很多属性,我们只需要注意一个属性:targetNamespace,它的值是:http:/tempuri.org/XMLSchema_Artical.xsd,把这段代码复制下,然后在xml文档中的note添加如下属性:最重要的是xsi:schemaLocation属性,要和targetNamespace属性保持一致,注意xsi:schemaLocation属性的后半部分是一个文件名XMLSchema_Artical.xsd,而该文件就是我们创建的Schema文件的文件名,特别注意,在这个文件名的前面一定要有空格和前面的代码分隔开。,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:好了,现在我们已经把xml和Schema关联起来,可以开始测试了。当我们打开xml文件的时候,我们留意到这里,如下图:出现一个波浪的情况,原因是我们的xml并不符合规范,鼠标移动到波浪显示字样:,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:现在出现的问题是:我们的notes元素中必须有内容,或者是子元素,下面我们要完成的任务是,给notes元素下,添加几个子元素,而我们题目上也要求根元素Notes 下包含0个或者多个 note子元素下面我们来了解下,如何实现在复合类型中要求该类型的子元素的实现:,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:我们已经发现,使用,可以定义在复合类型中,可以有子元素Sequence从该单词的中文解释,我们可以猜测到,该标签是可以限制我们子元素出现的顺序的,例如:这段代码,就要求,我们的xml文档中note和note1两个元素的顺序不能颠倒。当然,我们也可以不要求顺序:All标签表示,包含制定的元素,但是不要求顺序。,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:好了,现在再去看看xml文档会不会提示错误了:错误已经消失。但是我们也留意到在Schema中却出现了错误:前面我们已经学习了如何定义元素,但是我们并不知道如何限制元素的数量这里,我们看到minOccurs和maxOccurs两个属性,一个用来限制最小值,一个用来限制最大值,0表示最小可以没有,unbounded表示最大没有边界。这两个并没有错误,出错的是note元素的类型,我们仔细看下xml文档,发现Note元素也是一个符合类型的数据,所以,下面我们需要定义note这个复合类型。,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:根据题目要求,我们知道,note元素中要有制定的一些元素,而且元素顺序最好按照样本xml来定义,所以我们这样定义note元素的类型:,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:好,剩下的继续:有问题,AuthorType是一个新的类型,为什么需要这个新的类型呢?再来看看题目:Author元素必须有一个表示作者姓名的name子元素,其值为字符串。另外还可以有两个可选的子元素:表示作者性别sex和年龄age。如果出现sex元素,则只能从male和female中选择一个取值。如果出现age元素,取值范围:20-80(包含两边),name,sex,age三个元素顺序不限。注意,作者可以有多个,也就是author元素可以写无数个。可见,作者这个元素的要求还是蛮高的,下面,我们就来看看AuthorType,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:从题目上我们得知,Author元素也必须有一个或多个子元素,可见它也是一个复合类型的元素,所以我们用复合来定义AuthorType,而这里面的元素并不要求顺序,所以我们用all标签。这里面的元素,sex和age都是有问题的,应该他们都是使用了新的类型:SexType和AgeType。看来我们需要再来了解下这两个新类型:,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:先来分析下题目要求:如果出现sex元素,则只能从male和female中选择一个取值。要求上并没有提出sex元素必须有子元素,那么我们这个时候就不能再使用复合类型来定义sex元素的类型了,我们需要用简单类型来定义sex元素了:使用 xs:simpleType 标签来定义一个简单类型,该类型可以用来定义某一个元素内容的类型,已经其他约束,例如:上面的代码,使用xs:restriction标签,定义SexType类型的基类型是字符串,而且取值范围只能是male或者female。xs:enumeration标签标示枚举。,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:先来分析下题目要求:如果出现age元素,取值范围:20-80(包含两边)。其他的代码都和上面的一样,只有xs:maxInclusive 和xs:minInclusive 不一样他们分别表示:最大取值和最小取值,当然,AgeType的基类是integer数字我们才能这样定义。,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:到此,作者元素已经分析完毕,下面是tags元素了Tags元素可以看出,是表示文章搜索标签的含义,当然这些标签是一组字符它们用空格隔开,表示不同的搜索关键字。那么,这个元素的类型又是一个新的类型:TagsType,该类型定义如下:其他不难理解,xs:list 表示一个列表标签,制定该类型中有多个内容,就好似一个列表。Token也是一个内置的类型,在课本上有解释,它的数据格式如下Ajax xml JavaScript,简单的说就是用空格隔开的字符串。正好和我们要求的符合。,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:写完了需要的代码后,我们再来测试下,我们发现程序提示tags元素的类型不对,其实我们上面定义的类型是TagType,而不是tags要求的类型TagsType为什么我们要这样做呢?因为,tags元素的要求不只如此,我们把代码写完整 上面的代码很像程序中的方法重载,TagType被重载为TagsType类型,并且要求了该类型的列表元素的个数最小0,最大10.,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:为了测试tags元素类型的功能,我们修改最大长度为1,如何修改xml文档中的Tags元素的内容元素个数为两个,出现如下错误:可见,我们对tags元素的限制起到了效果。Tags元素的设定到此结束。接着下面的元素:,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:Hit元素,用来表示文章的点击率,题目要求:267可以看出,hit要有一个date属性,而且其值应是一个非负数的整数。所以,我们为该元素定义了一个新的类型HitType:这里可能不是很容易理解,首先我们认为hit是一个复合类型,它要求有自己的属性和内容,前面我们只是认为有子元素的就是复合类型,这里我们了解到有属性的也应该是复合类型。,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:那么怎么定义属性:在HitType这个复合类型中,定义一个子元素xs:attribute,表示该类型下包含属性的要求,属性名称为date,类型是date内置类型,use表示什么意思呢?Required,optional,prohibited三个值是它的取值范围分别表示,必须出现,可以出现,不能出现。这里,我们设置的是必须出现。xs:simpleContent标签又是什么意思呢?有些元素既像复合类型,又像简单类型,例如hit元素,既有属性,又有内容。所以我们就需要一个基于简单类型的复合类型,使用xs:complexType 的子元素xs:simpleContent,就可以实现上面的要求:,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:xs:simpleContent有一个子元素:extension,通过设置该元素的base属性,就可以设置xs:simpleContent元素的值类型。例如上面,我们设置为xs:nonNegativeInteger类型,该类型为内置类型,表示非负数的整数。到此,我们hit元素的约束就完成了,还剩下最后一个元素:url要求是:hit元素之后,必须有一个表示文章地址的url元素,其值为字符串,但必须以http:/news/开头,而且最后的文件后缀必须是html或者htmurl元素是一个简单类型,我们可以看这样定义:,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:xs:restriction的子元素xs:restriction 的子元素xs:pattern,可以来设定某一个字符串的格式,我们使用了正则表达式。http:/开头,以html或者html结尾最后是给note元素添加了一个属性postDate,并且该属性有一个默认值:2007-11-17,可以通过设置xs:attribute 的default属性来完成默认值的设置。,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:至此,我们就完成了所有的要求,剩下的就是测试下xml文档了。我们测试了url的有效性,如下:Hit元素的有效性:我们把数字该为负数,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:当然,作业并不能把Schema的所有知识涵盖,下面,我们把剩下的一些简单讲解下:任意类型:可以随意定义一个元素为任意类型,当你不确定元素类型的时候使用最有效。,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:前面,我们已经讲到了引用,但是我们引用的是一个元素,如果我们需要引用多个元素的组合呢?Schema为我们提供了分组来实现这一功能:,第十章 数据的组织方式:XML,10.4 XML SchemaSchema语法分析:分组的使用:联合类型:simpleType还有一个子元素union用来实现联合类型,例如:定义了一个电话类型,电话内容是数字和字符的组合。,第十章 数据的组织方式:XML,10.4 XML Schema作业:将下面的图书订单数据改写为一个XML文档,并且加上Schema约束。订单号:D87859676 订货时间:2005-09-21客户姓名:张大年 联系电话:邮寄地址:大直街东段1008号 邮政编码:850012书名:网站建设与维护 ISBN:100589 单价:32.00 数量8网址:要求:订单号必须是字符和数组的组合订货时间必须是时间,有默认值,默认值随意写客户姓名可以有多个,但是最多不能超过两个联系电话必须是11位的数字邮编必须是6位数字单价必须是非负数的数字网址必须符合网址格式,第十章 数据的组织方式:XML,