Schema的基本概念
是万维网协会推出的能够描述、约束和检查XML文档的新方法,它提供了更强大的功能,也是DTD的替代者。
与DTD 相比Schema的优势:
1.Schema可以针对未来的需求进行扩展;
2.Schema更加完善,功能也更强大;
3.Schema是基于XML编写的;
4.支持数据类型;
5.支持命名空间;
Schema建议规范中有两个基础的命名空间:
一个是用于Schema文档的Schema URI,即http://www.w3.org/2001/XMLSchema。通常使用xs来代表该命名空间。
另一个用于xml文档,即http://www.w3.org/2001/XMLSchema-instance,通常使用xsi来代笔该命名空间。
Schema文件
XML Schema本身也是一个XML文件,因为该文件必须有一个根元素。
每个Schema文件定义都以一个根元素xs:schema开始,该元素是属于http://www.w3.org/2001/XMLSchema名称空间的。
Schema的引用方法:
当XML引入XML Schema时,根据XML文档的元素是否属于某个特定命名空间的,可以按照如下两种方式引入:
不属于特定的命名空间,通过属性xsi:noNamespaceSchemaLocation引入
如果被引入的Schema文件需要约束XML文件中不属于任何特定命名空间元素,使用上面的属性引入;
属于特定的命名空间,通过属性xsi:shemaLocation引入
如果被引入的Schema文件需要约束XML文件中属于某个特定命名空间的元素,使用上面的属性引入。
语法如下:
<根元素名称[xmlns:命名空间别名="命名空间URI"]+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="[命名空间URI Schema文件路径]+">
xsi:schemaLocation=”[命名空间URI Schema文件路径]+”:该属性值比较灵活,可以同时引入多个Schema文件。每一个Schema的引入都需要一个命名空间URI和Schema文件路径,命名空间URI和Schema文件路径中间使用空格间隔。
语法结构:
<?xml version="1.0" encoding="gb2312"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
......[元素、属性、注释、数据类型、schema的复用]
</xs:schema>
除此之外还可以为该元素指定两个属性:
elementFormDefault:该属性值可以是qualified或unqualified,用于指定XML文档使用该Schema中定义的局部元素时是否必须用命名空间限定。
attributeFormDefault:该属性值可以是qualified或unqualified,用于指定XML文档使用该Schema中定义的局部属性时是否必须用命名空间限定。
元素
简单元素:不包含属性和子元素
复杂元素:
全局元素:
局部元素:定义在复杂类型中的元素
Schema中定义元素的语法主要包括以下三类:
语法1:
<element name="元素名称" type="数据类型" [default="默认值"] [minOccurs="最少出现的次数"] [maxOccurs="最多出现的次数"]/>
语法2:
<element name="元素名称" [default="默认值"] [minOccurs="最少出现的次数"] [maxOccurs="最多出现的次数"]>
Elementtype
</Element>
语法3:
<element ref="引用元素名称" [default="默认值"] [minOccurs="最少出现的次数"] [maxOccurs="最多出现的次数"]/>
属性说明:
name:由程序员制定,元素的名字
type:元素的数据类型
default:该元素的默认值,该属性是可选的。
minOccurs:指定该元素出现的最少次数,默认值为1.该属性是可选的。如果属性值为0则表示该元素的可选的;如果大雨0,则该元素是强制出现的。如果minOccurs没有与maxOccurs同时出现,则该属性值只能为0或1.
maxOccurs:该元素出现的最大次数,默认值为1。该属性是可选的。如果指定该元素可以出现任意多次,则该属性值为“unbounded”;如果minOccurs没有与maxOccurs同时出现,则该属性值不能为0.
ref:引用的元素名称。
元素补充说明:
根据元素所出现的位置,元素还可以划分为全局元素和局部元素,在schema元素中定义的元素称为全局元素,全局元素可以被其他的任意元素所引用。局部元素实在复杂类型中定义的元素,局部元素仅能在定义该元素的外部元素中使用。
在元素声明中还可以定义元素组,元素组是把多个元素及其约束组合在一起,使用时作为一个整体。元素组能更好地实现复用。
元素组定义的语法:
<xs:group name="元素组名称">包含多个元素及约束</xs:group>
引用语法:
<xs:group ref="元素组名称">
属性定义的语法如下所示:
语法1:属性定义
<xs:attribute name="属性名" type="属性类型" [default="默认值"]|[fixed="固定值"]>
语法2:属性调用
<xs:attribute ref="属性名"></xs:attribute>
属性说明如下:
name:XML元素的属性名
type:属性的数据类型,可以使用内置数据类型或simpleType元素定义的数据类型
default:属性的默认值,该属性可选(不能与fixed属性同时存在)
ref:引用已经定义好的属性名称
use:只能在所属元素确定后才能使用,选项optional表示可选属性,设默认值prohibited被禁止的属性required是必须属性。
属性补充说明:全局属性与局部属性
与元素声明类似,在schema元素中定义的属性为全局属性,全局属性可以被其他任意元素引用。在复杂属性中定义的属性为局部属性,局部属性只能在定义该属性的元素中使用。参见文件:attdemo.xsd及其约束的xml文档。
属性组是把多个属性作为一个属性组,在使用时仅需引用该属性组即可引用属性组中的所有属性。通过定义属性组可以更好实现复用。
定义属性组的语法:
<xs:attributeGroup name="属性组名称">包含多个属性</xs:attributeGroup>
引用属性组的语法:
<xs:attributeGroup ref="属性组名称">
注释:
1.XML语法中的注释
<!--注释的内容-->
2.通过标记
数据类型:
Schema的数据类型可以根据该元素内容划分为简单类型和复杂类型
简单类型是指元素的内容既不包括子元素也不包括属性
复杂数据类型是指元素的内容中包括子元素、包括属性或既包括子元素也包括属性
Schema允许用户根据实际需要扩展数据类型。因此按照扩展方式可以分为:
内置数据类型
内置数据类型是被预先定义好的,这些数据类型全部位于命名空间http://www.w3.org/2001/XMLSchema下,所有的内置数据类型都是简单类型,既可以做元素的数据类型,也可以做属性的数据类型。内置数据类型又分为内置基本数据类型和内置扩展数据类型,其中后者是在前者基础上发展过来的。
内置数据类型分为3各部分:
任意类型(其他内置数据类型都源自任意类型)包括两种:
anyType:表示该元素为任意类型,与DTD的ANY类似。此类型对于元素的内容没有任何约束。
anySimpleType:表示该元素为任意简单类型。即定义为该类型的元素除不能包含子元素和属性外,没有任何其他的约束。
内置基本数据类型
字符串及相关类型
string:表示字符串,原封不动保留所有空白
QName:表示一个包含XML命名空间在内的名称
数值类型:
decimal:表示特定精度的数字
float:表示单精度32位浮点数,支持科学计数法
double:表示双精度64位浮点数,支持科学计数法
haxBinary:表示十六进制数
日期类型:
date:表示日期YYYY-MM-DD格式的时间
gYearMonth:表示年月YYYY-MM格式的时间
gYear:表示年YYYY格式的时间
gMonthDay:表示月日MM-DD格式的时间
getDay:表示日期DD格式的时间
getMonth:表示月份MM格式的时间
时间类型:
duration:表示持续时间PnYnMnDTnHnMnS,P其实定界符,T分隔符,s前面的n可以是小数
dateTime:表示特定的时间YYYY-MM-DDThh:mm:ss:sss,sss表示毫秒数
time:表示特定的时间hh:mm:ss:sss,sss表示毫秒数
boolean类型
boolean:布尔型,只能接受true、false、0、1
anyURI:表示一个URI,用来定位文件
二进制数据类型
base64Binary:表示任意base64编码的二进制数
hexBinary:表示任意16进制编码的二进制数
Notation类型
NOTATION:表示在XML中的NOTATION类型,不能在模式中直接出现的抽象类型,只能用于派生其他类型
内置扩展数据类型(两个扩展点:string、decimal)
String类型派生出来用于约束属性的类型及其描述(只能约束属性,功能与DTD保持一致)
NMTOKEN必须是合法的XML名称,只能由字母、数字、”_”、”-“、”.”、”:”组成
NMTOKEN多个NMTOKEN,空格为分隔符
ID标识符
IDREF引用另一个ID
IDREFS引用多个已有的ID,空格为分隔符
ENTITY外部实体
ENTITIES多个外部实体,空格为分隔符
String类型派生出来的其他类型及其描述
normalizedString:将字符串内容包含的换行、制表符和回车符都替换成空白
token:将字符串内容包含的换行、制表符和回车符都替换成空白,自动删除字符串前后的空白,如果字符串中间包含多个连续的空白,则会被压缩成一个空白
language:定义合法的语言代码
Name:含有一个有效的XML名称的字符串
NCName:省略或不带有命名空间前缀的XML名称字符串,不含冒号
decimal类型派生出来的类型及其描述:
数据类型 | 描述 | 最小值 | 最大值 |
---|---|---|---|
integer | 无限制的整数 | 无限制 | 无限制 |
nonNegativeInteger | 无限制的非负整数 | 0 | 无限制 |
nonPositiveInteger | 无限制的非负正数 | 无限制 | 0 |
long | 64位的有符号整数 | -2^63 | (2^63)-1 |
positiveInteger | 无限制的正整数 | 1 | 无限制 |
negetiveInteger | 无限制的负整数 | 无限制 | -1 |
unsignedLong | 64位的无符号整数 | 0 | (2^64)-1 |
int | 32位的有符号整数 | -2^31 | (2^31)-1 |
unsignedInt | 32位的无符号整数 | 0 | (2^32)-1 |
short | 16位有符号整数 | -2^15 | (2^15)-1 |
unsignedShort | 16位无符号整数 | 0 | (2^16)-1 |
byte | 8位有符号整数 | -2^31 | (2^7)-1 |
unsignedByte | 8位无符号整数 | 0 | (2^8)-1 |
用户自定义数据类型:
用户自定义的基本数据类型和用户自定义的复杂数据类型。所有的复杂数据类型都是用户自定义得到的。按照位置可以分为全局类型和局部类型:全局类型是在scheme标记内定义的类型,该类型可以被所有元素使用;局部类型是定义在某个元素内部的类型,该类型只能被定义该类型的元素所引用。按照复杂程度划分,分为简单类型和复杂类型。
自定义简单数据类型:
自定义简单类型是在内置数据类型的基础上通过限制、列表和联合中一种或多种方式形成的新数据类型。简单数据类型的定义语法:
<xs:simpleType [name="自定义类型名称"]>[限制、列表、联合一种或几种方式]</xs:simpleType>
name属性:自定义的数据类型名称。当定义的简单数据类型为全局数据类型,即直接在
限制:
如果通过限制方式产生自定义类型,需要使用的标记为restriction,语法如下:
<xs:simpleType [name="自定义类型名称"]>
<xs:restriction base="基类型">
[约束特征]+
</xs:restriction>
</xs:simpleType>
Base属性值为前面定义的内置数据类型,约束特征主要包括以下几种类型:
范围说明:在实际应用中,往往需要把某个值限定在一定的范围内,如雇员的年龄在18-60之间,分数在0-100之间等。minlnclusive(最小包含,相当于>=),maxlnclusive(最大包含,相当于<=),minExclusive(最小不包含,相当于>),maxExclusive(最大不包含,相当于<)。这4个范围面只能适用于整数、日期、时间类型。
长度说明:限制值的长度,比如需要限制密码的长度为8位,用户名的长度为6到20位。length:内容长度、minLength:最小长度、maxLength:最大长度。主要使用的类型为字符型、QName型、AnyURI型。不可以适用于日期、时间、数字和boolean。length不能与minLength、maxLength一起使用。
精度说明:在某些情况下,需要限定某个数的数字位数,比如支票上的最大单位是亿,最小的单位是分。totoalDigits:总数字、fractionDigits:分数数字(小数点后面的)。
枚举说明:经常将某个值限定在一组可选的值之中,比如性别要在“男”和“女”之间进行选择。enumeration:枚举。enumeration可以在除boolean以后的其他类型中使用。
模式匹配:有时候需要复杂的格式约束,比如需要对邮件地址的格式进行检查。可以使用pattern面进行正则表达式的限制。
空白处理:
whitespace的有效值为:preserve、replace、collapse。
preserve:所有的空白都被保留:
replace:制表符、换行、回车都用一个空格进行替换,但连续的空格不被压缩为一个空格。
collapse:制表符、换行、回车都被空格替换,连续的空格被压缩为一个空格。
列表:
Schema中定义列表类型使用元素指定列表元素有两种方式:
1.为
<xs:simpleType [name="自定义类型名称"]>
<xs:list itemType="列表元素类型"></xs:list>
</xs:simpleType>
2.为
<xs:simpleType [name="自定义类型名称"]>
<xs:list>
<simpleType.../>
</xs:list>
</xs:simpleType>
Schema使用
1.为
<xs:simpleType [name="自定义类型名称"]>
<xs:union memberTypes="[列表元素类型]+"></xs:union>
</xs:simpleType>
2.为
<xs:simpleType [name=""]>
<xs:union>
[<simpleType.../>]+
</xs:union>
</xs:simpleType>
复杂类型所约束的内容可能包含属性、子元素或同时包含子元素和属性。复杂元素也有可能包含子元素的同时包含字符内容,这样的元素被称为混合内容。定义复杂元素的语法格式如下所示:
<xs:complexType [name=""] [mixed="true|false"]>
[顺序、选择、无序、简单内容、复杂内容]+
</xs:complexType>
name属性:自定义的数据类型名称。当定义饿简单数据类型为全局数据类型,即直接在
mixed属性:如果mixed属性值设置为true,则表示该元素的内容为混合内容。该属性默认值为false。
顺序
使用该元素定义的数据类型用于设定子元素的顺序,表示该元素的子元素是有序的。使用该元素的语法格式如下:
<xs:complexType name="">
<xs:sequence [maxOccurs="最多出现的次数"][minOccurs="最少出现的次数"]>
[<xs:element name="test" type="xs:string" minOccurs="最少出现的次数" maxOccurs="最多出现的次数"></xs:element>]+
</xs:sequence>
</xs:complexType>
maxOccurs属性:最多出现的次数,通常为一个固定的数字。可以作为sequence的属性,也可以作为element的属性。当最多次数没有限制时该值为unbounded。
minOccurs属性:最少出现的次数,为一个固定的数字。可以作为sequence的属性,也可以作为element的属性。
选择
使用该元素定义的数据类型用于设定子元素的选择关系,表示该元素的子元素可以根据实际需要从子元素中选择一个使用。使用该元素的语法格式如下:
<xs:complexType>
<xs:choice [maxOccurs=""] [minOccurs=""]>
[<xs:element name="test" type="string" minOccurs="min" maxOccurs="max"></xs:element>]+
</xs:choice>
</xs:complexType>
无序
使用
<xs:complexType name="mytype">
<xs:all minOccurs="" maxOccurs="1">
[<xs:element minOccurs="" maxOccurs="" default=""></xs:element>]+
</xs:all>
</xs:complexType>
maxOccurs属性:此时该值可以为0或1;
minOccurs属性:此时该值只能在0或1。
简单内容
如果元素只包含属性,不包含子元素,则可以使用该元素定义元素内容。具体的内容方式包括在基类型上扩展和限制两种方式:
限制
扩展
复杂内容
使用该元素有点类似于编程语言的继承,相当于在某一基类型的基础上进行扩展或限制。如果元素包含子元素(是否包含属性不限制),则可以使用该元素对元素内容进行定义。
限制
扩展