1、第四章 XML schema 4.1 XML schema简介nSchema是一种与DTD类似的,同样用于定义在各种XML文档中使用标记的规范的一个工具。n从功能上来讲,Schema与DTD是等效的,但是前者比后者更具灵活性,由于DTD使用了一种特殊的规范来定义使用XML标记的规范,有许多常用的限制不能用DTD来表述,人们开始寻求另外的解决方法,微软发展了一套不同于DTD方法来定义XML数据类型,这个方法成为了现今的W3C定义的Schema的原型。4.2 XML Schema与与DTD的比较的比较Schema具有如下优点:n一致性:Schema使得对XML的定义不必再利用一种特定的形式化的语言
2、,而是直接借助XML自身的特性,利用XML的基本语法规则来定义XML文档的结构,使得XML达到了从内到外的统一,也为XML的进一步发展奠定了坚实的基础。n扩展性:Schema对DTD进行了扩充,引入了数据类型、命名空间,从而使其具备较强的可扩展性。n互换性:利用Schema,我们能够书写XML文档以及验证文档的合法性。另外,通过特定的映射机制,还可以将不同的Schema进行转换,以实现更高层次的数据交换。n规范性:同DTD一样,Schema也提供了一套完整的机制以约束XML文档中置标的使用,但相比之下,后者基于XML,更具有规范性。Schema利用元素的内容和属性来定义XML文档的整体结构,如
3、哪些元素可以出现在文档中、元素间的关系是什么、每个元素有哪些内容和属性以及元素出现的顺序和次数等等,都可一目了然。4.3 XML元素声明元素声明n4.3.1根元素n4.3.2简单元素n4.3.3复杂元素n4.3.4特殊元素n4.3.5元素组n4.3.6元素限制n4.3.7全局元素与局部元素n4.3.8 any元素4.3.1 根元素根元素n每一个schema文档都必须拥有一个根元素schema元素,并且这个根元素也是唯一的。nSchema文档其他所有的元素及其属性声明和数据类型定义都必须嵌套在根元素中。4.3.2 简单元素简单元素n简单元素是指不包含子元素和属性的元素。n是一种简单数据类型的元素
4、。n简单元素的数据类型既可以是内建数据类型,也可以是用户派生的简单类型。4.3.2 简单元素简单元素n声明一个简单元素的具体的语法格式如下:nnxsd:simpleType name=”data-type”nn4.3.3 复杂元素复杂元素n包含子元素的元素就是复杂元素,对应的,它属于复杂数据类型。声明一个复杂元素的语法规则是:nnnnnnnn4.3.4 特殊元素特殊元素n1.空元素空元素就是元素内容为空值的元素,它也不包含子元素。有两种表示空值的方法:使用属性 nillable=”true”或者使用属性 minOccurs=”0”。n2.ANY类型的元素一个anyType类型不以任何形式约束其
5、包含的内容,我们可以象使用其他类型一样使用anyType。声明一个元素为anyType类型的语法是:4.3.4 特殊元素特殊元素n3.混合内容元素n如果一个元素,它既需要包含子元素,又需要包含字符数据,那么它就必须作为一个混合内容形式的元素。n具体的语法格式如下:nnnnnnn4.3.4 特殊元素特殊元素n4.选择型元素n如果一个元素只能在有限的几个子元素中选择一个子元素作为元素内容,那么需要将它声明为选择型的元素,选择型元素也是复杂类型元素。n具体的格式如下:nnnnnnnnn4.3.5 元素组元素组n在一个元素的多个子元素中,有时候几个子元素之间存在一些逻辑上的联系,比如我们描述地址时,门
6、牌号、街道和城市这几个元素就存在联系,这时候如果将它们分为一组也是较为合适的。n基于这种需要,因此XML提供了一个声明若干个元素为一组的机制,这就是元素组。4.3.5 元素组元素组n具体的格式如下:nnnnnnn4.3.6 元素限制元素限制n可以通过指定元素的minOccurs和maxOccurs属性来限制元素的出现次数。n当需要指定元素的默认值时,就需要使用到元素的default属性和fixed属性。n使用sequence关键字的意思就是规定子元素在xml文档中的出现顺序是顺序出现的与schema文件中声明的顺序一致。nall,这种方式使得序列中的元素可以按照任意的顺序出现,但是这些元素每个
7、最多只能出现一次。nchoice,这一种也即是前面介绍过的选择型元素,它起到的作用就是在若干个给定的子元素中选择一个出现在XML文档中,注意只能选择一个,不能选多个,也不能选择不在给定范围内的子元素。4.3.7 全局元素与局部元素全局元素与局部元素n在schema文件中,schema根元素的直接子元素就是全局元素。n局部元素就是它的父元素不是schema根元素的元素。4.3.8 any元素元素nXML存在一个较为特殊的元素,那就是any元素,在复杂类型内使用 any元素意味着任何元素都可以出现在那个位置上,这可有效地使它成为事先无法预知的内容的占位符。4.3.8 any元素元素n使用any元素
8、时,也可以通过指定它的名称空间属性namespace来指明any元素的详细情况,namespace有四种取值,分别为:n#any:来自任何命名空间的任何元素 n#local:任何非限定元素(不属于命名空间)n#other:非targetNamespace命名空间中的任何元素 n#targetNamespace:targetNamespace 中的任何元素 4.4 XML schema 属性声明属性声明n4.4.1声明属性n4.4.2属性引用n 4.4.3属性组n 4.4.4 any类型属性n 4.4.5属性限制4.4.1 声明属性声明属性n使用attribute关键字来声明一个属性。n与元素不
9、同,属性都需要是简单的数据类型。n声明属性的语法如下:4.4.2 属性引用属性引用n属性也存在引用,可以引用已声明的属性来作为自己元素的属性。n声明一个属性引用使用的关键字也是ref,具体的格式如下:n注意引用的属性一定要有声明,不能引用不存在的属性。4.4.3 属性组属性组n属性也可以声明成一组属性组。声明属性组使用的关键字是:attributeGroup,具体的格式请看下面:nnnnnn属性组有助于XML文档结构的模块化,允许在一处声明常用的属性集合,然后在一个或多个文档中引用。4.4.4 any类型属性类型属性n属性也有一个用声明任意属性类型的方法,这就是使用anyAttribute关键
10、字进行属性声明。n声明为any类型的属性也就具备了占位符的功能,在XML文档实例中它允许将这种类型的属性替换成任意类型的属性。n它也提供名称空间属性,相应的属性值取值也是分别为:n#any:来自任何命名空间的任何元素 n#local:任何非限定元素(不属于命名空间)n#other:非targetNamespace命名空间中的任何元素 n#targetNamespace:targetNamespace 中的任何元素 4.4.5 属性限制属性限制n关键字use来对属性的出现做出限制。nuse的值可以为:required、optional和prohibited三种,相应的意思分别为必须出现、选择出现
11、和禁止出现 4.4.5 属性限制属性限制ndefault和fixed两个值用于规定属性的内容。ndefault规定属性的默认值,而fixed规定属性的内容一定要是fixed指定的值。n并且当一个属性指定了default值的话,那么如果需要指定use的值,就一定要选择optional。4.5 注释注释nXML Schema提供三个元素用于注释,以提高代码的可读性,并且也可以为其它应用程序提供一定的辅助信息。n三个元素分别是:annotation、documentation和appinfo,其中documentation和appinfo是annotation的子元素。4.6 XML Schema数
12、据类型数据类型n4.6.1 原始数据类型n4.6.2 派生数据类型n4.6.3 用户派生数据类n4.6.4 约束面4.6.1 原始数据类型原始数据类型n19种原始数据类型中可以分成几个大类,分别是:程序设计数据类型XML数据类型二进制数据类型时间数据类型。4.6.1 原始数据类型原始数据类型n1.程序设计数据类型n在大部分的程序设计语言或者数据库系统中都会有一些常见的数据类型,这几类就是string、boolean、decimal、float和double类型。n2.XML数据类型n共有三种数据类型属于XMl数据类型,分别是anyURI、QName和NOTATION。4.6.1 原始数据类型原
13、始数据类型n3.二进制数据类型n表示二进制数据类型的有两种,hexBinary和base64Binary。4.6.1 原始数据类型原始数据类型n4.时间类型n有9种原始数据类型用于时间的表示:n第一种是表示持续时间,对应的数据类型是duration,它基于ISO8601数据格式标准,表示时间的长度,如1个小时,3分钟等等。n第二种表示一个时间或者日期,是一个时间点,相应的数据类型有date、time和dateTime。n第三种表示循环的日期或者时间,分别是gDay、gMonth、gMonthDay、gYear和gYearMonth。4.6.2 派生数据类型派生数据类型nXML Schema定义
14、了25种派生数据类型,它们都是在原始数据类型的基础上定义的,此外XML Schema也允许用户定义自己的派生数据类型。4.6.2 派生数据类型派生数据类型nXML Schema定义的派生数据类型可以分为几组:n第一组是整型数,它包括如下几种数据类型:integer:十进制整型数;positiveInteger:正的整数;negativeInteger:负的整数;nonPositiveInteger:非正整数;nonNegativeInteger:非负整数。4.6.2 派生数据类型派生数据类型n第二组是与计算机字长成倍数关系的一组数据类型:byte:8位带符号数(-128127之间);unsig
15、nedByte:8位无符号数(0255之间);short:16位短整型数(-3276832767之间);unsignedShot:16位无符号短整型数(065535之间);int:32位整型数(-21474836482147483647之间);unsignedInt:无符号32位整型数(04294967295之间);long:64位整型数(-92233720368547758089223372036854775807之间);unsignedLong:64位无符号整型数(018446744073709551615之间)。4.6.2 派生数据类型派生数据类型n第三组是基于XML属性类型构成的一组数
16、据类型:ID:文档中单个元素唯一的标示符;IDREF文档中对一个元素ID的引用;IDREFS:文档中对多个个元素ID的引用,每个ID之间使用空格进行分隔;ENTITY:文档非解析实体名称;ENTITIES:文档多个非解析实体名称,每个名称之间使用空格分隔;NMTOKEN:带有特定约束的字符串。NMTOKENS:多个带有特定约束的字符串,每个名称之间使用空格分隔。4.6.2 派生数据类型派生数据类型n第四组是XML的一类数据类型:Name:以字母或者下划线和冒号开始,后继字符包括数字、字母、下划线、连字符和句点的字符串类型。NCName:以字母或者下划线开始,后继字符包括数字、字母、下划线、连字
17、符和句点的字符串类型。normalizedString:将字符串中的回车或者制表符之类的空白符变为由空格代替的字符串类型。token:将字符串中多个相邻空白压缩为一个空白符,并且去除前导和末尾空格后变成的新的字符串类型。4.6.3 用户派生数据类型用户派生数据类型n利用XML Schema已有的数据类型原始数据类型和派生数据类型,来派生出自己需要的数据类型。4.6.3 用户派生数据类型用户派生数据类型n1.简单数据类型(simpleType)n简单数据类型只能包含字符数据,不能包含子元素,也不能包含属性。派生简单数据类型主要通过三个方面来实现。列表(list)派生 联合派生 限制派生 4.6.
18、3 用户派生数据类型用户派生数据类型n2.复杂数据类型(complexType)n复杂数据类型是一类可以包含若干子元素和属性的一类数据类型,内建数据类型是不包含复杂数据类型的,复杂数据类型是需要用户自己进行派生而获得的,复杂数据类型也可以通过对已有的简单数据类型或者复杂数据类型进行扩充和限制而获得。4.6.3 用户派生数据类型用户派生数据类型n2.复杂数据类型(complexType)n复杂类型的派生方法,那就是通过如下格式:nnnnnnnnn除此之外,还有通过扩充或者限制已有的简单或者复杂数据类型除此之外,还有通过扩充或者限制已有的简单或者复杂数据类型的方法的方法 4.6.4 约束面约束面n
19、对于restriction派生方法,有12个约束面辅助进行派生限制,这12种约束可以分成5个类别:范围限制枚举限制处理空白限制十进制数字限制模式限制4.6.4 约束面约束面n1.范围限制n有7个约束面是作用于范围的,他们分别是:minInclusive、maxInclusive、minExclusive、maxExclusive、minLength、maxLength和length。4.6.4 约束面约束面n2.枚举限制n枚举限制就是针对一个基础数据类型限定一列允许值而派生出新的数据类型。新的数据类型的值域就只能是这一列允许值,不在这一列值中出现的取值都不属于这个新的数据类型。4.6.4 约束
20、面约束面n3.处理空白限制n对于文档中的空白,约束面是whiteSpace,它有三种取值方式来约束空白的处理方法,分别是:collapse、preserve和replace。ncollapse规定将一个空白序列压缩成单个空格并且去掉序列的前导和结尾空白;preserv规定忽略空白,不对其进行处理;而replace则规定将所有形式的空白如制表符、换行符、回车符等都转变成空格符。4.6.4 约束面约束面n4.十进制数字限制n对于十进制数,有两个约束面用来限制它们:totalDigits和fractionDigits。totalDigits限制一个十进制数的最大位数,fractionDigits约束
21、十进制数的小数部分的最大位数。4.6.4 约束面约束面n5.模式约束n模式约束是所有约束中最复杂的一类约束,一般都是通过正则表达式来描述模式约束。4.7 import与与includen4.7.1 importn4.7.2 include4.7.1 importnSchema的import元素用于将元素声明、简单或者复杂类型定义等模式结构信息从外部模式导入当前模式文件中。n必须注意的是如果使用名称空间,则外部模式的目标名称空间应该与当前导入模式文档的名称空间相同。n外部模式文件也可以不使用名称空间。4.7.2 includeninclude元素用于将元素声明、简单和复杂数据类型定义等模式结构从
22、外部模式文档导入include模式文档中,并且外部模式文件所在的名称空间必须与当前导入的模式文件保持匹配,否则必须使用空名称空间。4.8 小结小结n本章主要介绍Schema的相关内容,Schema可用于对各种XML文档进行类型说明,它提供一套完整的机制来约束XML文档的结构。Schema本身就是使用XML进行定义,与XML文档保持了一致性,同时Schema具备了良好的扩展性。n首先介绍了如何声明XML元素,包括一般的简单元素、复杂元素、特殊元素和元素组的声明方法以及如何对元素进行限制。描述了全局元素与局部元素的关系。n接着介绍了属性声明的一般方法、属性引用和属性组以及对属性进行限制的方法。也介绍了Schema进行注释的方式。n最后一部分介绍了Schema的数据类型,XML Schema中共定义了44种数据类型,其中19种是原始数据类型,用户不能创建原始数据类型。另外的25种是基于这19种原始数据类型派生的,属于派生数据类型。派生数据类型就是根据一个或者多个现有的数据类型进行限制或扩展。用户也可以定义自己的派生数据类型。所有44种数据类型都属于内建数据类型。