第4章在XML文档中使用 Scherma.ppt
第第4章章 XML Scherma4.1XMLSchema概述4.2XMLSchema的文档结构4.3XMLSchema标记及属性定义4.4全局声明和局部声明4.5XMLSchema的组定义4.6XMLSchema中的注释4.7XMLSchema命名空间4.1 什么是什么是XML Schema(1)XMLSchema是W3C开发的一种新的约束XML文件的模式,是一种特殊的XML文件,遵循XML的语法规则。DTD则具有自己的语法,所以,只需懂得XML的语法规则即可编写Schema,无需学习其他语法规则。XMLSchema可以弥补DTD的不足之处,例如:DTD的数据类型有限,当声明一个标记的标记内容为文本数据时,声明为“#PCDATA”,却不能限制文本的具体类型(如:整型,浮点型等)。而XMLSchema则可以具体定义数据的具体类型,XMLSchema不但提供了丰富的数据类型,还允许用户自定义类型。XMLSchema常用的数据类型见下表:4.1 什么是什么是XML Schema(2)更多详细信息可参考:http:/www.w3.org/TR/xmlschema-2/#built-in-datatypesXMLSchema中常用的基本数据类型基本数据类型说明及举例备注String表示字符串,例:“Hello”Boolean表示布尔型,例:true或falseDecimal表示十进制任意精度数字,例:33.3,25.0Decimal用于准确表现数值Float表示单精度32位浮点数Double表示双精度64位浮点数DateTime表 示 时 间,数 据 形 式 为:CCYY-MM-DDThh:mm:ss,例:2008-12-27/09:55:23CC,YY,MM,DD分别表示世纪,年,月,日。T表示分隔符.hh,mm,ss分别表示时,分,秒Time表示时间,数据形式为:hh:mm:ss.sss,例:10:11:23Century表示世纪,数据形式为:CC,例:20gYear表示年份,数据形式为:CCYY,例:2008gMonth表式月份值,数据形式为:CCYY-MM,例:2008-12gDate表示日其值,数据形式为:CCYY-MM-DD,例:2008-12-27AnyURL任意一个URL,例:http:/www.aabb.ccXML Schema中常用的基本数据类型4.1 什么是什么是XML Schema(3)XMLSchema中常用的基本数据类型与DTD相比,XMLSchema具有如下优点:(1)可以更容易地描述文档结构。(2)可以方便地定义数据模型。(3)可重用性。虽然Schema比DTD对数据的限制好,但实现相同的功能Schema比DTD的代码长很多。而且,Schema也不是万能的,DTD可以实现Schema不能实现的功能。XMLSchema不能完全替代DTD,它们各有优势。返回上面代码中第一行以XML声明开始,说明这是一个XML文件。所有内容都添加在根标记。“xsd”是名称空间的前缀,可以任意定义,一般都设置为“xsd”或“xs”。XMLSchema文档是特殊的XML文档,要遵循XML的语法规则。W3C规定,一个XMLSchema文档的根标记必须是“schema”,名称空间必须是“http:/www.w3.org/2001/XMLSchema”,下面是它的基本形式如下:4.2 XML Schema的文档结构(的文档结构(1)Schema内容4.2 XML Schema的文档结构(的文档结构(2)一个简单的实例:这段程序只定义了一个标记。返回XMLSchema示例(1)7-302-12066-8JAVA实用教程HerbertSchildt马海军64.00必要声明使用的文档7-5037-1978投资学张中华谢进城19.00声明是一份xml使用默认的命名空间关于booklist的说明自定义最多出现的次数属性说明子元素说明子元素按顺序出现属性值只出现一次用户自定义枚举类型authorlistType作者列表4.3 XML Schema标记及属性定义标记及属性定义 4.3.1简单类型标记的定义4.3.2自定义数据类型4.3.3复杂类型标记子标记的定义4.3.4复杂类型标记的属性的定义4.3.5空标记及混合内容标记的定义返回简单类型标记的定义(简单类型标记的定义(1)简单标记是指不带有任何属性及子标记的标记,定义简单标记可以通过标记来完成。格式为:例如:简单类型标记的定义(简单类型标记的定义(2)标记的属性名称和作用见下表:属性名称作用name表示标记的名称,值为XML的有效名称type表示标记内容的类型ref表示引用已经定义的标记,不能和type同时使用use表示该标记出现的类型,值分可以是optional、prohibited或required。所代表的意义分别是可选的、禁止的和必须的from表示该标记是否受名称空间限制,值可以是qualified或unqualified。id表示可以唯一标识该标记的符号default标记的默认值fixed表示标记的值固定不变,不能和default同时使用返回自定义数据类型(自定义数据类型(1)XMLSchema已经提供了40多种的数据类型,把数据已经分的很具体了,但有时为了更好的满足需要,Schema还可自定义的数据类型。自定义数据类型是指以一个XMLSchema类型为基础,添加一些限制条件,使之成为一个新的类型。自定义数据类型使用标记,通过这个标记可以给XMLSchema提供的数据类型添加一些限制,从而构造出新的类型。常用的有以下6中类型:1限定数值范围2限定数值位数3限定字符串范围4枚举类型5列表类型6联合类型自定义数据类型(自定义数据类型(2)1限定数值范围XMLSchema中提供了4种标记用来限制数值的范围,、和它们都有一个“value”属性,意义分别为:(1)表示小于等于“value”属性的值。(2)表示大于等于“value”属性的值。(3)表示小于“value”属性的值。(4)表示大于“value”属性的值。自定义数据类型(自定义数据类型(3)1限定数值范围例如:上面这段代码定义了一个“score”标记,标记值的类型为“simpleType1”。接下来的6行定义了一个新的类型,名称为“simpleType1”。标记的“base”定义了该类型的基本类型是“float”,接下来的两行限定了数值范围是0100之间,包括0和100。自定义数据类型(自定义数据类型(4)2限定数值位数 在XMLSchema中有一个“decimal”数据类型,用来准确地表示数值。通过标记和来准确限制数值。其中:用来限制数值的总位数。用来限制小数点后面的位数。例如:自定义数据类型(自定义数据类型(5)3限定字符串范围 限定字符串范围分为两种:限定字符串长度和限定字符串内容。XMLSchema通过、和来限定字符串的长度,用来限定字符串的内容。限定字符串长度的例子:自定义数据类型(自定义数据类型(6)3限定字符串范围 XMLSchema中的标记可以限定字符串的内容,例如:上面这段代码定义了一个“tel”标记,该标记的值要满足正则表达式“(0d2,3-)?d7,8”所限定的值。这个表达式的意义是,“d”表示任意数字,“0d2,3”表示区号,以“0”开头后面是23位数字。“-”是固定字符,“?”表示有0个或1个,“d7,8”表示7到8位数字。所以,该表达式所表示的值是一个可以带区号,也可以不带区号的电话号码。自定义数据类型(自定义数据类型(7)4枚举类型XMLSchema中使用标记来定义枚举类型。例如:上面的这段代码定义了一个标记“jilin”,该标记的值只能为“changchun”、“jilin”和“songyuan”中的一个。枚举类型可用于除布尔型以外的所有简单类型。枚举的值可以包含空格,但每一个枚举项的值必须是唯一的。自定义数据类型(自定义数据类型(8)5列表类型在XMLSchema中,用标记来定义列表类型。例如:在定义列表类型的同时,还可以指定列表的长度或长度范围,分别用标记或、来指定。例如:自定义数据类型(自定义数据类型(9)6联合类型联合类型是一个标记的内容可以是多种类型中的一种,例如:上面的代码段说明,“code”标记的内容可以是字符串型的数据,也可以是整型的数据。如果标记内容的数据类型不包含在“memberTypes”中所列举的数据类型中,则相应XML文件也不是有效的XML文件。返回复杂类型标记子标记的定义复杂类型标记子标记的定义(1)复杂类型的标记是指含有子标记或属性的标记。在XMLSchema中,用标记来定义复杂类型的标记。通过可以指定标记与标记或标记与属性的从属关系。定义子标记的语法格式为:子标记描述复杂类型标记子标记的定义复杂类型标记子标记的定义(2)一个实例:这段程序定义了4个标记,标记“eng”、“math”、“physics”是“score”的子标记。在标记块中,通过标记封装了一组标记,表示这些标记的出现有固定的顺序。复杂类型标记子标记的定义复杂类型标记子标记的定义(3)除了标记外,其他可选的标记还有和。表示其中包含的标记可以无顺序地出现一个或多个。表示其中包含的标记可以任意出现一个。在XMLSchema中,用“minOccurs”和“maxOccurs”属性来定义子标记出现的次数,分别表示最少出现次数和最多出现次数。有以下几种情况:(1)maxOccurs=”*”,表示该标记可以出现一次或多次。(2)maxOccurs=”1”,表示该标记只能出现一次。(3)minOccurs=”0”,表示该标记可选,即出现0次或1次。除了上述情况,还可以指定其他具体的值。复杂类型标记子标记的定义复杂类型标记子标记的定义(4)一个例子:这段程序说明,“name”标记是一个必须出现的标记,“sex”标记没有这两个属性,也表示是必须出现的标记。“age”是一个可选的标记。返回复杂类型标记的属性的定义(复杂类型标记的属性的定义(1)XMLSchema中,标记的属性通过标记来声明,其基本语法格式为:标记的属性除了“name”和“type”属性外,还有其他一个常用的属性“use”,表示该属性出现的情况,属性值可以是optional、prohibited和required中的一个。分别表示该属性是可有可无、禁止赋值的和必须赋值。“use”属性的值还可以是fixed或default,意义分别为:该属性的值是固定的或指定属性的默认值,默认值可以改变。复杂类型标记的属性的定义(复杂类型标记的属性的定义(2)例子:返回空标记及混合内容标记的定义(空标记及混合内容标记的定义(1)空标记是指不含有任何标记内容的标记,但可以含有属性。例如,空标记可以用如下的方法定义:这段代码定义了一个新的类型“emptyType”,“content”属性为“empty”说明该类型的标记不含有任何标记内容,标记的“base”属性的值为“anyType”,说明该类型不建立在任何类型的基础上。该类型含有一个属性“att1”,属性值为字符串类型。空标记及混合内容标记的定义(空标记及混合内容标记的定义(2)混合内容的标记是指既包含文本内容又包含子标记的标记。下面的例子定义了一个含有混合内容的标记。上面代码中 标记的“content”属性的值设置成“mixed”,说明该类型标记所标记的内容可以有文本,也可以有子标记。上面这段代码说明,该类型的标记可以含有文本数据,也可以含有一个子标记“element1”。空标记及混合内容标记的定义(空标记及混合内容标记的定义(3)定义只含有文本数据和属性的标记的格式为:上面代码中标记说明该标记的内容只包含某一类型的文本,文本类型通过“base”属性来指定。返回4.4 全局声明和局部声明全局声明和局部声明 在XMLSchema中,标记可以分为全局和局部的。直接在元素下声明的标记和属性是全局的,这些元素和属性可以通过和元素的“ref”属性来引用。注意:(1)声明的全局标记和属性的名称必须是唯一的。(2)在全局声明中不能使用“ref”属性。(3)全局声明的标记在XML文档中可以作为根标记出现。在复杂类型定义内部声明的标记和属性是局部的,由于简单类型不包含子标记和属性,所以局部标记和属性不能在简单类型定义内部声明。返回全局标记示例第一种方式声明的3个标记都是全局的,全局标记的名字必须是唯一的,而且只能声明一次。全局标记都可以作为根标记出现。第二种方式中,element1是全局的,element2和element3是局部的,根标记只能是element1。元素的全局声明和局部声明最明显的区别是在其他声明中可以引用全局声明,而局部声明只能存在于它们自己的局部范围内4.5 XML Schema的组定义的组定义(1)对于Schema中多次重复出现的一组标记或属性,我们可以把它们定义成一个标记组或属性组,然后通过引用来使用。这样可以大大提高代码的重用性,从而也使代码的结构性变得更强。在XMLSchema中标记组用标记定义,属性组用标记来定义。例如,定义一个组:4.5 XML Schema的组定义的组定义(2)使用组:标记和标记类似于标记,但不同的是,标记结构可以被标记使用,而标记结构或标记结构只能被标记调用。返回4.6 XML Schema中的注释中的注释 Schema文件的注释可以和XML文件的注释方法相同,即:此外,Schema还提供了另一种添加注释的功能,通过标记来添加注释,它含有两个子标记和。它们的区别在于,前者是面向用户的,后者是面向解析器的。例如:booktypybook 返回3.7XML命名空间XML作为一种允许用户定义自己标记的标记语言,很可能出现名称重复的情况,命名空间是一种避免名称冲突的方式。W3C颁布的命名空间(NameSpace)标准中对命名空间的定义是:XML命名空间提供了一套简单的方法,将XML文档和URI引用标记的名称相结合,来限定其中的元素和属性名。也即命名空间给XML名称添加前缀,使其能够区分所属的领域,从而为元素和属性提供唯一的名称,其最重要的用途是用于融合不同词汇集的XML文档。什么是命名冲突在相同的作用域当中,如果有两个元素或属性的名字完全相同,就会出现冲突。例如,我的电脑包括内存和硬盘两个元素,这两个元素都包括容量这个属性。当这两个元素统称为存储设备时,内存设备要用到两容量属性,这时容量属性就会出现冲突,不知道具体是哪一个容量属性解决命名冲突途径为解决命名冲突的问题,引入命名空间的概念。命名空间的声明方法为:xmlns=namespaceURI或者xmlns:某前缀=namespaceURI“xmlns=”和“xmlns:某前缀=为命名空间声明,等号后面以引号括起的值,必须是一个统一格式资源标识符(URL),用来代表名称空间所属的领域。第一种是默认命名空间声明,第二种是显式命名空间声明。命名空间的使用声明了命名空间,有了命名空间下的合法名称,就可以使用命名空间来区别具有相同名称的元素和属性了。命名空间的使用方法是在属于该名称空间的元素或属性名称前添加前缀和冒号“:”,表示其所属的名称空间。课后习题答案1、TTFTF2、ABC;BC;D;ABD;BD;ABD