Jun
23
XML Schema 是基于 XML 的 DTD 替代者。XML Schema也称为XML框架或XML模式。通过Schema可以描述和规范XML文档的数据模式和组织结构,规定XML文档中可以包含哪些元素、这些元素拥有哪些子元素及其出现的顺序和次数,还规定每个元素和属性的数据类型。与DTD相比,通过XML Schema可以更好地规范和验证有效的XML文档。
一、Schema文档结构
XML Schema总是以独立文档形式存在,其文件扩展名为.xsd。XML Schema文档本身就是一个符合XML规范的、格式良好的XML文档,该文档通过一套预先定义的XML元素及其属性创建的,正是这些特定的元素和属性规定了XML文档的结构和内容模式。
1、Schema基本结构
Schema文档从一个XML文档声明开始,其后的内容是对根元素schema的声明。根据需要,还可以从一个Schema文档中包含或导入其他Schema文档。
Schema文档的基本框架可以描述如下:
其中,xsd:schema表示Schema文档根元素;xmlns:xsd属性把XML Schema名称空间映射到前缀xsd,W3C在该名称空间中定义了很多元素,用于定义其他XML文档的语义约束;targetNamespace属性指定一个目标名称空间,在Schema文档中声明的全局元素、属性、类型或组等都属于该名称空间。
在一个Schema文档中可以包含或导入其他Schema文档来形成模式。若其他Schema文档与当前Schema文档具有相同的目标名称空间,则可以通过xsd.include元素包含其他Schema文档,用schemaLocation属性指定要包含的模式文档;若其他Schema文档与当前Schema文档分别拥有不同的目标名称空间,则通过xsd:import元素包含其他Schema文档,用namespace属性指定该模式的命名空间,用schemaLocation属性指定要导入的模式文档。
在Schema文档中,schema元素的子元素是全局元素,全局元素的属性为全部属性,而其他元素或属性则为局部元素或局部属性。
2、在XML文档中引入Schema
根据Schema根元素是否包含目标名称空间,可以通过两种方式来引入Schema文档:
a、若在Schema文档中对根元素指定了targetNamespace属性,则在XML文档中通过其根元素的xsi:schemaLocation属性来引用Schema文档:
其中,rootelement表示XML文档的根元素,xsi:schemaLocation属性指定要引用的Schema文档的URInate,此URI由两部分构成:一部分是Schema根元素的targetNamespace属性值,另一部分是Schema文档的完整路径,这两部分之间用空格分隔。
elementFormDefault属性指定如何限定XML文档中的元素。若把elementFormDefault属性设置为qualified,则表示在XML文档中必须使用前缀或通过设置默认名称空间来显式限定所有元素,而且默认名称空间应当与Schema根元素的目标名称空间保持一致。若把该属性设置为unqualified,则意味着只有全局元素才必须被显式限定,局部声明的元素不得被限定。在这种情形下,限定一个局部声明时错误的。
同样的,attributeFormDefault属性参数的含义相同。
b、若在Schema文档中未对根元素指定targetNamespace属性,则在XML文档中通过其根元素的xsi:noNamespaceSchemaLocation属性来引用Schema文档:
二、Schema元素声明
在Schema中,可以通过元素声明来规定XML文档使用的元素名称、元素内容及元素的数据类型等属性。每个Schema的根元素都是xsd:schema,其他元素声明必须包含在这个根元素内部。
1、声明简单元素
在Schema中,简单元素是只能包含字符串的元素。声明为:
2、声明复合元素
在Schema中,复合元素是指包含子元素或属性的元素。复合元素可使用<xsd:element>和</xsd:element>标记来声明,此外,还需要把其子元素或属性包含在<xsd:complexType>与</xsd:complexType>之间。
子元素之间的逻辑关系分为有序、无序和互斥三种类型:
3、引用元素
在Schema中,每个元素都可以声明为一个独立的元素。声明一个复合元素时,对其子元素的声明可以通过元素引用方式来实现。语法格式为:
其中,elementname表示另一个元素的名称。通常,是先通过<xsd:element>定义元素,然后使用该引用方式导入对应的元素中。
三、Schema属性声明
在Schema中,属性的值只能是简单类型,只能包含文本数据。属性是没有顺序的,而元素是有顺序的。虽然元素的功能比属性强大,但在某些场合,属性时很有用的。一般而言,对于元数据,使用属性;对于数据,则使用元素。属性声明用于命名属性,并使之与某个特定的简单数据类型相关联。
在Schema中,属性通过xsd:attribute元素来声明,语法格式如下:
xsd:attribute元素具有以下属性:
四、Schema数据类型
在Schema中,数据类型分为简单类型和复杂类型,前者只能包含字符数据,后者既可以包含字符数据,也可以包含子元素和属性。
1、简单类型
常用的简单数据类型有:
在Schema中,除了直接使用上述简单类型声明元素或属性的数据类型外,还可以把一种简单类型作为基础,通过添加额外的限制创建自定义简单数据类型。
自定义简单数据类型时,首先通过xsd:simpleType元素定义一种简单数据类型,然后对简单数据类型通过xsd:restriction添加限制来实现,语法是:
base规定该约束所使用的基类型,也就是上述提到的简单数据类型之一。在xsd:restriction元素内部,可以通过按任意顺序对该类型进行以下限制:
2、复杂类型
复杂类型就是可以包含其他元素或属性,在Schema中,复杂类型用xsd:complexType元素定义。在xsd:complexType元素中,可以用xsd:attribute元素定义属性,也可以通过sequence、all、choice组合器来实现子元素的嵌套。
一、Schema文档结构
XML Schema总是以独立文档形式存在,其文件扩展名为.xsd。XML Schema文档本身就是一个符合XML规范的、格式良好的XML文档,该文档通过一套预先定义的XML元素及其属性创建的,正是这些特定的元素和属性规定了XML文档的结构和内容模式。
1、Schema基本结构
Schema文档从一个XML文档声明开始,其后的内容是对根元素schema的声明。根据需要,还可以从一个Schema文档中包含或导入其他Schema文档。
Schema文档的基本框架可以描述如下:
<?xml version="1.0" encoding="gb2312"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="URI">
<xsd:include schemaLocation="URI" />
<xsd:import namespace="URI" schemaLocation="URI" />
<!--元素和属性声明-->
</xs:schema>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="URI">
<xsd:include schemaLocation="URI" />
<xsd:import namespace="URI" schemaLocation="URI" />
<!--元素和属性声明-->
</xs:schema>
其中,xsd:schema表示Schema文档根元素;xmlns:xsd属性把XML Schema名称空间映射到前缀xsd,W3C在该名称空间中定义了很多元素,用于定义其他XML文档的语义约束;targetNamespace属性指定一个目标名称空间,在Schema文档中声明的全局元素、属性、类型或组等都属于该名称空间。
在一个Schema文档中可以包含或导入其他Schema文档来形成模式。若其他Schema文档与当前Schema文档具有相同的目标名称空间,则可以通过xsd.include元素包含其他Schema文档,用schemaLocation属性指定要包含的模式文档;若其他Schema文档与当前Schema文档分别拥有不同的目标名称空间,则通过xsd:import元素包含其他Schema文档,用namespace属性指定该模式的命名空间,用schemaLocation属性指定要导入的模式文档。
在Schema文档中,schema元素的子元素是全局元素,全局元素的属性为全部属性,而其他元素或属性则为局部元素或局部属性。
2、在XML文档中引入Schema
根据Schema根元素是否包含目标名称空间,可以通过两种方式来引入Schema文档:
a、若在Schema文档中对根元素指定了targetNamespace属性,则在XML文档中通过其根元素的xsi:schemaLocation属性来引用Schema文档:
<?xml version="1.0"?>
<rootelement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="URI"
elementFormDefault="qualified"|"unqulified"
attributeFormDefault="qualified"|"unqulified">
...
</rootelement>
<rootelement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="URI"
elementFormDefault="qualified"|"unqulified"
attributeFormDefault="qualified"|"unqulified">
...
</rootelement>
其中,rootelement表示XML文档的根元素,xsi:schemaLocation属性指定要引用的Schema文档的URInate,此URI由两部分构成:一部分是Schema根元素的targetNamespace属性值,另一部分是Schema文档的完整路径,这两部分之间用空格分隔。
elementFormDefault属性指定如何限定XML文档中的元素。若把elementFormDefault属性设置为qualified,则表示在XML文档中必须使用前缀或通过设置默认名称空间来显式限定所有元素,而且默认名称空间应当与Schema根元素的目标名称空间保持一致。若把该属性设置为unqualified,则意味着只有全局元素才必须被显式限定,局部声明的元素不得被限定。在这种情形下,限定一个局部声明时错误的。
同样的,attributeFormDefault属性参数的含义相同。
b、若在Schema文档中未对根元素指定targetNamespace属性,则在XML文档中通过其根元素的xsi:noNamespaceSchemaLocation属性来引用Schema文档:
<?xml version="1.0"?>
<rootelement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="URI"
elementFormDefault="qualified"|"unqulified"
attributeFormDefault="qualified"|"unqulified">
...
</rootelement>
<rootelement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="URI"
elementFormDefault="qualified"|"unqulified"
attributeFormDefault="qualified"|"unqulified">
...
</rootelement>
二、Schema元素声明
在Schema中,可以通过元素声明来规定XML文档使用的元素名称、元素内容及元素的数据类型等属性。每个Schema的根元素都是xsd:schema,其他元素声明必须包含在这个根元素内部。
1、声明简单元素
在Schema中,简单元素是只能包含字符串的元素。声明为:
<xsd:element name="元素名" type="数据类型" minOccurs="最少出现次数" maxOccurs="最多出现次数" default="默认值" fixed="固定值" />
2、声明复合元素
在Schema中,复合元素是指包含子元素或属性的元素。复合元素可使用<xsd:element>和</xsd:element>标记来声明,此外,还需要把其子元素或属性包含在<xsd:complexType>与</xsd:complexType>之间。
子元素之间的逻辑关系分为有序、无序和互斥三种类型:
引用
<xsd:sequence>...</xsd:sequece>:用于组合有序子元素
<xsd:all>...</xsd:all>:用于组合无序子元素
<xsd:choice>...</xsd:choice>:用于组合互斥子元素
<xsd:all>...</xsd:all>:用于组合无序子元素
<xsd:choice>...</xsd:choice>:用于组合互斥子元素
3、引用元素
在Schema中,每个元素都可以声明为一个独立的元素。声明一个复合元素时,对其子元素的声明可以通过元素引用方式来实现。语法格式为:
<xsd:element ref="elementname" ... />
其中,elementname表示另一个元素的名称。通常,是先通过<xsd:element>定义元素,然后使用该引用方式导入对应的元素中。
三、Schema属性声明
在Schema中,属性的值只能是简单类型,只能包含文本数据。属性是没有顺序的,而元素是有顺序的。虽然元素的功能比属性强大,但在某些场合,属性时很有用的。一般而言,对于元数据,使用属性;对于数据,则使用元素。属性声明用于命名属性,并使之与某个特定的简单数据类型相关联。
在Schema中,属性通过xsd:attribute元素来声明,语法格式如下:
<xsd:attribute name="属性名" type="数据类型" ... />
xsd:attribute元素具有以下属性:
引用
name:指定属性的名称;
id:指定属性的数据类型;
type:指定属性的数据类型;
ref:用于引用属性名称;
default:指定属性的默认值;
fixed:指定属性的固定值;
use:指定如何使用属性,有三个取值:optional表示属性时可选的(默认值),prohibited表示该属性时固定的(此时必须指定fixed属性),required指定该属性是必需的。
id:指定属性的数据类型;
type:指定属性的数据类型;
ref:用于引用属性名称;
default:指定属性的默认值;
fixed:指定属性的固定值;
use:指定如何使用属性,有三个取值:optional表示属性时可选的(默认值),prohibited表示该属性时固定的(此时必须指定fixed属性),required指定该属性是必需的。
四、Schema数据类型
在Schema中,数据类型分为简单类型和复杂类型,前者只能包含字符数据,后者既可以包含字符数据,也可以包含子元素和属性。
1、简单类型
常用的简单数据类型有:
引用
boolean:布尔型数据;
date:日期型数据,其格式为YYYY-MM-DD;
dateTime:日期时间型数据,包含日期和时间,其格式为YYYY-MM-DDThh:mm:ss;
decimal:表示任何精度的十进制数字;
integer:整形数据;
nonNegativeInteger:表示大于或等于0的整数;
nonPositiveInteger:表示小于或等于0的整数;
date:日期型数据,其格式为YYYY-MM-DD;
dateTime:日期时间型数据,包含日期和时间,其格式为YYYY-MM-DDThh:mm:ss;
decimal:表示任何精度的十进制数字;
integer:整形数据;
nonNegativeInteger:表示大于或等于0的整数;
nonPositiveInteger:表示小于或等于0的整数;
在Schema中,除了直接使用上述简单类型声明元素或属性的数据类型外,还可以把一种简单类型作为基础,通过添加额外的限制创建自定义简单数据类型。
自定义简单数据类型时,首先通过xsd:simpleType元素定义一种简单数据类型,然后对简单数据类型通过xsd:restriction添加限制来实现,语法是:
<xsd:simpleType name="类型名称">
<xsd:restriction id="约束标识" base="基类型">
<!-- 对简单类型添加的约束 -->
</xed:restriction>
</xsd:simpleType>
<xsd:restriction id="约束标识" base="基类型">
<!-- 对简单类型添加的约束 -->
</xed:restriction>
</xsd:simpleType>
base规定该约束所使用的基类型,也就是上述提到的简单数据类型之一。在xsd:restriction元素内部,可以通过按任意顺序对该类型进行以下限制:
引用
enumeration:指定元素或属性的值为枚举类型,只能从可能值列表中选取一个;
fractionDigit:指定小数点后面的最大位数,仅用于限制任意精度的十进制数字;
length:指定元素或属性包含的字符个数;
minExclusive:指定元素或属性的下限值,元素或属性必须大于该值;
maxExclusive:上限值,必须小于该值;
minLength:指定字符串的最小长度;
maxLength:指定字符串的最大长度;
minInclusive:指定元素或属性值的下限值,元素或属性值必须大于或等于该值;
maxInclusive:上限值,必须小于或等于该值;
pattern:指定数据值必须匹配的正规表达式模式;
totalDigits:指定有效数字的位数;
whiteSpace:指定对字符串中空白的处理方式。有三个取值:preserve表示保留空白;replace指定用空格代替所有制表符、换行符和回车符;collapse执行replace操作并删除相邻的、开头处和结尾处的空格。
fractionDigit:指定小数点后面的最大位数,仅用于限制任意精度的十进制数字;
length:指定元素或属性包含的字符个数;
minExclusive:指定元素或属性的下限值,元素或属性必须大于该值;
maxExclusive:上限值,必须小于该值;
minLength:指定字符串的最小长度;
maxLength:指定字符串的最大长度;
minInclusive:指定元素或属性值的下限值,元素或属性值必须大于或等于该值;
maxInclusive:上限值,必须小于或等于该值;
pattern:指定数据值必须匹配的正规表达式模式;
totalDigits:指定有效数字的位数;
whiteSpace:指定对字符串中空白的处理方式。有三个取值:preserve表示保留空白;replace指定用空格代替所有制表符、换行符和回车符;collapse执行replace操作并删除相邻的、开头处和结尾处的空格。
2、复杂类型
复杂类型就是可以包含其他元素或属性,在Schema中,复杂类型用xsd:complexType元素定义。在xsd:complexType元素中,可以用xsd:attribute元素定义属性,也可以通过sequence、all、choice组合器来实现子元素的嵌套。