XML Schema
XSD文档至少要包含:schema根元素和XML模式命名空间的定义、元素定义。需要注意的是XSD中必须定义一个且只能定义一个schema根元素,根元素中包括模式的约束,XML模式命名空间的定义,其他命名空间的定义、版本信息、语言信息和其他一些信息。
1、schema根元素
语法如下:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> ... </xsd:schema>
2、元素
语法如下:
<xsd:element name="user" type="xsd:string" />
XSD中元素是利用element标识符来声明,在上面的示例中name属性是元素的名字,type属性是元素值的类型,可以使XML Schema中内置的数据类型或其他类型。
全部元素如下:
元素 | 说明 |
name | 元素的名称 |
type | 元素值的类型 |
minOccurs | 该元素在父元素中最少出现的次数(默认为1,必须大于等于0) |
maxOccurs | 该元素在父元素中最多出现的次数(默认为1,必须大于等于0),当设置为unbounded表示不限制。 |
3、引用元素
引用元素是利用element标记符的ref属性实现的。主要适用于避免在文档中多次定义同一个元素。表示当前元素与被引用的元素相同。
语法如下:
<xsd:element name="user" type="xsd:string" /> <xsd:sequence> <xsd:element ref="user" /> <!--当前元素就是user元素--> </xsd:sequence>
4、别名
别名主要利用element标识符中的属性substitutionGroup实现的。
语法:
<xsd:element name="user" type="xsd:string" substitutionGroup="yonghu" />
该语句表示该行的元素名可以是user或用户,如:
<yonghu>admin</yonghu> <user>admin</user>
这两行xml都是符合条件的。
5、设置默认值与固定值
语法如下:
<xsd:element name="city" type="xsd:string" default="xian" /> <xsd:element name="country" type="xsd:string" fixed="china" />
通过default属性的设置,可以在XML文档中没有对city定义时赋予默认值,而是用fixed属性,可以给元素country设定一个固定的值china,并且不允许改变。
6、利用组合器控制结构
1、sequence组合器,定义了一列元素必须按照模式中指定的顺序显示(如果是可选的,也可以不显示)。
<xsd:sequence> <xsd:element name="first" type="xsd:string" /> <xsd:element name="middle" type="xsd:string" /> <xsd:element name="last" type="xsd:string" /> </xsd:sequence>
2、all组合器,允许所定义的元素可以按照任意顺序显示,all元素的子元素在默认情况下士必须的,而且每次最多显示一次。
<xsd:all minOccurs="0"> <xsd:element name="first" type="xsd:string" /> <xsd:element name="middle" type="xsd:string" /> <xsd:element name="last" type="xsd:string" /> </xsd:all>
(3)choice组合器,允许指定多组声明中的一个,用于互斥情况。
<xsd:choice> <xsd:element name="first" type="xsd:string" /> <xsd:element name="middle" type="xsd:string" /> <xsd:element name="last" type="xsd:string" /> </xsd:choice>
7、定义属性
在XML Schema文档中可以按照定义元素的方法定义属性,但受限制程度较高。可以应用在attribute元素定义中的属性如下表所示。
属性 | 含义 |
defalt | 初始默认值 |
fixed | 不能修改和覆盖的固定属性值 |
name | 属性的名称 |
ref | 对前一个属性定义的引用 |
type | 该属性的XSD类型或者简单类型 |
use | 如何使用属性 optional(可选属性,即属性不是必须的,默认是这个)、prohibited(禁止使用)或者required(强制必须)。 |
form | 确定attributeFormDefault的本地址 |
id | 模式文档中属性唯一的ID |
8、创建属性
语法如下:
<xsd:attribute name="age" type="xsd:integer" />
该语句定义了一个名为age的属性,它的值必须为整数。把它添加到模式中时,它必须是schema元素,complexType元素或者attributeGroup元素的子元素。
代码示例:
<xsd:element name="name"> <xsd:complexType> <xsd:sequence> <xsd:element name="first" type="xsd:string" /> </xsd:sequence> <xsd:attribute name="age" type="xsd:integer" use="optional" /> <!--将属性添加到元素name属性中--> </xsd:complexType> </xsd:element>
以上文档对应有效的XML文档如下:
<?xml version="1.0"?> <name age="27"> <first>string</first> </name>
该示例不但说明了如下约束属性,还展示了组合器的用法。
三、XML Schema数据类型
1、Schema基本数据类型
Schema的基本数据类型如下:
数据类型 | 说明 |
boolean | true/false |
datetime | 格式:CCYY-MM-DDThh:mm:ss |
decimal | 任意精度的十进制数字 |
string | 字符串数据 |
int | 整型 |
nonNegativeInteger | 大于或等于0的整型 |
nonPositiveInteger | 小于或等于0的整型 |
short | 短整型 -32768到32767 |
2、约束
内置的数据类型功能虽然已经有一定的限制功能,但是还是远远不足够的,更进一步的约束还是来看看约束。
约束 | 说明 |
enumeration | 用空格分开的一组指定的数值,它把数据类型约束为指定的值 |
fractionDigit | 指定小数点后的最大位数 |
length | 长度单位 |
minExclusive | 下限值 |
maxExclusive | 上限值 |
minLength | 最小长度单位 |
maxLength | 最大长度单位 |
minInclusive | 最小值,所有的值都应该大于或等于该值 |
maxInclusive | 最大值,所有的值都应该小于或等于该值 |
pattern | 数据类型的值必须匹配的指定模式,必须是一个正则表达式 |
totalDigits | 指定小数最大位数的值 |
whiteSpace | 其值为preserve(值中的空格不能改变)、replace(所有的制表符、换行符、回车符都用空格代替)、collapse(执行replace,删除相邻的、结尾处和开头处的空格)。 |
要使用上面约束表的约束,就要利用元素restriction。这个元素中有两个属性:ID属性是模式文档中restriction元素的位置标识符;base属性设置为一个内置的XSD数据类型或者现有的简单类型定义,它是一种被限制的类型。
示例:将一个整数的取值范围设置为1~100之间。
<xsd:restriction base="xsd:int"> <xsd:minInclusive value="1" /> <xsd:maxInclusive value="100" /> </xsd:restriction>
3、简单类型
简单类型是对一个节点的可能值进一步限制的自定义数据类型。创建简单类型需要利用simpleType元素,其定义如下:
<simpleType id="ID" name="NCName" final="(#all|((list|union|restriction)))" />
ID属性应唯一地标明文档内的simpleType元素,name不能使用冒号字符。simpleType不能包含元素,也不能有属性,它基本上是一个值,或者是一个值的集合。
例如:
<xsd:simpleType name="USState"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="AK"> <xsd:enumeration value="AL"> <xsd:enumeration value="AR"> </xsd:restriction> </xsd:simpleType> <xsd:element name="statement" type="USState" />
以上文档对应有效的xml文档如下:
<statement>AK</statement>
注意取值只能够为AK、AR、AL中的一个。
4、列表类型
list可以用来定义列表类型。
<xsd:simpleType name="listOfIntType"> <xsd:list itemType="Integer"/> </xsd:simpleType> <xsd:element name="listOfMyInt" type="listOfType"/>
listIfIntType这个类型被定义为一个Integet的列表,元素listOfMyInt的值可以是几个整数,他们之间用空格分开。
有效的xml文档如下:
<listOfMyInt>1 2 3 123</listOfMyInt>
5、联合类型
union可以用来定义一个联合类型。例如:
<xsd:simpleType name="zipUnion"> <xsd:union memberTypes="USState listOfMyIntType"/> </xsd:simpleType> <xsd:element name="zips" type="zipUnion"/>
用union来定义一个联合类型,里面的成员类型保罗USState和listOfMyIntType,应用了联合类型的元素的值可以是这些原子类型或列表类型中的一个类型的示例,但是一个元素实例不能同时包含两个类型。
有效的XML文档如下:
<zips>CA</zips> <zips>9192 192391 129</zips> <zips>AK</zips>
无效的XML文档如下:
<zips>AL 2231</zips>
同时包含两个是错误的。
6、匿名类型
前面定义元素类型的时候总是先定义一个数据类型,然后再把元素的type设成新定义的数据类型。如果这个新的数据类型只会用一次,我们就可以直接设置在元素定义里面,而不用另外来设置。
例如:
<xsd:element name="quantity"> <xsd:simpleType> <xsd:restriction base="xsd:positiveInteger"> <xsd:maxExclusive value="100"/> </xsd:restriction> </xsd:simpleType> </xsd:element>
元素quantity的类型就是一个从1~99的整数。对于这种没有用type引入,直接定义在element元素里面的类型,我们称之为匿名类型。
7、复杂类型
复杂类型的定义必须使用complexType元素,在这里可以包含属性和元素。在复杂类型的使用中,主要是complexType和simpleType配合使用。
8、内容模型
内容模型可以对在XML文档内使用的元素、属性和类型进行限制,确定用户可以再XML实例的那些等级添加自己的元素和属性。
1、any内容模型
在XML中声明元素时,any是默认的内容模型,该模型可以包含文本、元素和空格。
例如:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="name"> <xsd:complexType> <xsd:sequence> <xsd:element name="first" type="xsd:string" /> <xsd:element name="middle" type="OtherNames" /> <xsd:element name="last" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="OtherNames"> <xsd:sequence> <xsd:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> </xsd:schema>
例子中xsd:any元素说明该类型允许添加内容。
XSD文档至少要包含:schema根元素和XML模式命名空间的定义、元素定义。需要注意的是XSD中必须定义一个且只能定义一个schema根元素,根元素中包括模式的约束,XML模式命名空间的定义,其他命名空间的定义、版本信息、语言信息和其他一些信息。
1、schema根元素
语法如下:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> ... </xsd:schema>
2、元素
语法如下:
<xsd:element name="user" type="xsd:string" />
XSD中元素是利用element标识符来声明,在上面的示例中name属性是元素的名字,type属性是元素值的类型,可以使XML Schema中内置的数据类型或其他类型。
全部元素如下:
元素 | 说明 |
name | 元素的名称 |
type | 元素值的类型 |
minOccurs | 该元素在父元素中最少出现的次数(默认为1,必须大于等于0) |
maxOccurs | 该元素在父元素中最多出现的次数(默认为1,必须大于等于0),当设置为unbounded表示不限制。 |
3、引用元素
引用元素是利用element标记符的ref属性实现的。主要适用于避免在文档中多次定义同一个元素。表示当前元素与被引用的元素相同。
语法如下:
<xsd:element name="user" type="xsd:string" /> <xsd:sequence> <xsd:element ref="user" /> <!--当前元素就是user元素--> </xsd:sequence>
4、别名
别名主要利用element标识符中的属性substitutionGroup实现的。
语法:
<xsd:element name="user" type="xsd:string" substitutionGroup="yonghu" />
该语句表示该行的元素名可以是user或用户,如:
<yonghu>admin</yonghu> <user>admin</user>
这两行xml都是符合条件的。
5、设置默认值与固定值
语法如下:
<xsd:element name="city" type="xsd:string" default="xian" /> <xsd:element name="country" type="xsd:string" fixed="china" />
通过default属性的设置,可以在XML文档中没有对city定义时赋予默认值,而是用fixed属性,可以给元素country设定一个固定的值china,并且不允许改变。
6、利用组合器控制结构
1、sequence组合器,定义了一列元素必须按照模式中指定的顺序显示(如果是可选的,也可以不显示)。
<xsd:sequence> <xsd:element name="first" type="xsd:string" /> <xsd:element name="middle" type="xsd:string" /> <xsd:element name="last" type="xsd:string" /> </xsd:sequence>
2、all组合器,允许所定义的元素可以按照任意顺序显示,all元素的子元素在默认情况下士必须的,而且每次最多显示一次。
<xsd:all minOccurs="0"> <xsd:element name="first" type="xsd:string" /> <xsd:element name="middle" type="xsd:string" /> <xsd:element name="last" type="xsd:string" /> </xsd:all>
(3)choice组合器,允许指定多组声明中的一个,用于互斥情况。
<xsd:choice> <xsd:element name="first" type="xsd:string" /> <xsd:element name="middle" type="xsd:string" /> <xsd:element name="last" type="xsd:string" /> </xsd:choice>
7、定义属性
在XML Schema文档中可以按照定义元素的方法定义属性,但受限制程度较高。可以应用在attribute元素定义中的属性如下表所示。
属性 | 含义 |
defalt | 初始默认值 |
fixed | 不能修改和覆盖的固定属性值 |
name | 属性的名称 |
ref | 对前一个属性定义的引用 |
type | 该属性的XSD类型或者简单类型 |
use | 如何使用属性 optional(可选属性,即属性不是必须的,默认是这个)、prohibited(禁止使用)或者required(强制必须)。 |
form | 确定attributeFormDefault的本地址 |
id | 模式文档中属性唯一的ID |
8、创建属性
语法如下:
<xsd:attribute name="age" type="xsd:integer" />
该语句定义了一个名为age的属性,它的值必须为整数。把它添加到模式中时,它必须是schema元素,complexType元素或者attributeGroup元素的子元素。
代码示例:
<xsd:element name="name"> <xsd:complexType> <xsd:sequence> <xsd:element name="first" type="xsd:string" /> </xsd:sequence> <xsd:attribute name="age" type="xsd:integer" use="optional" /> <!--将属性添加到元素name属性中--> </xsd:complexType> </xsd:element>
以上文档对应有效的XML文档如下:
<?xml version="1.0"?> <name age="27"> <first>string</first> </name>
该示例不但说明了如下约束属性,还展示了组合器的用法。
三、XML Schema数据类型
1、Schema基本数据类型
Schema的基本数据类型如下:
数据类型 | 说明 |
boolean | true/false |
datetime | 格式:CCYY-MM-DDThh:mm:ss |
decimal | 任意精度的十进制数字 |
string | 字符串数据 |
int | 整型 |
nonNegativeInteger | 大于或等于0的整型 |
nonPositiveInteger | 小于或等于0的整型 |
short | 短整型 -32768到32767 |
2、约束
内置的数据类型功能虽然已经有一定的限制功能,但是还是远远不足够的,更进一步的约束还是来看看约束。
约束 | 说明 |
enumeration | 用空格分开的一组指定的数值,它把数据类型约束为指定的值 |
fractionDigit | 指定小数点后的最大位数 |
length | 长度单位 |
minExclusive | 下限值 |
maxExclusive | 上限值 |
minLength | 最小长度单位 |
maxLength | 最大长度单位 |
minInclusive | 最小值,所有的值都应该大于或等于该值 |
maxInclusive | 最大值,所有的值都应该小于或等于该值 |
pattern | 数据类型的值必须匹配的指定模式,必须是一个正则表达式 |
totalDigits | 指定小数最大位数的值 |
whiteSpace | 其值为preserve(值中的空格不能改变)、replace(所有的制表符、换行符、回车符都用空格代替)、collapse(执行replace,删除相邻的、结尾处和开头处的空格)。 |
要使用上面约束表的约束,就要利用元素restriction。这个元素中有两个属性:ID属性是模式文档中restriction元素的位置标识符;base属性设置为一个内置的XSD数据类型或者现有的简单类型定义,它是一种被限制的类型。
示例:将一个整数的取值范围设置为1~100之间。
<xsd:restriction base="xsd:int"> <xsd:minInclusive value="1" /> <xsd:maxInclusive value="100" /> </xsd:restriction>
3、简单类型
简单类型是对一个节点的可能值进一步限制的自定义数据类型。创建简单类型需要利用simpleType元素,其定义如下:
<simpleType id="ID" name="NCName" final="(#all|((list|union|restriction)))" />
ID属性应唯一地标明文档内的simpleType元素,name不能使用冒号字符。simpleType不能包含元素,也不能有属性,它基本上是一个值,或者是一个值的集合。
例如:
<xsd:simpleType name="USState"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="AK"> <xsd:enumeration value="AL"> <xsd:enumeration value="AR"> </xsd:restriction> </xsd:simpleType> <xsd:element name="statement" type="USState" />
以上文档对应有效的xml文档如下:
<statement>AK</statement>
注意取值只能够为AK、AR、AL中的一个。
4、列表类型
list可以用来定义列表类型。
<xsd:simpleType name="listOfIntType"> <xsd:list itemType="Integer"/> </xsd:simpleType> <xsd:element name="listOfMyInt" type="listOfType"/>
listIfIntType这个类型被定义为一个Integet的列表,元素listOfMyInt的值可以是几个整数,他们之间用空格分开。
有效的xml文档如下:
<listOfMyInt>1 2 3 123</listOfMyInt>
5、联合类型
union可以用来定义一个联合类型。例如:
<xsd:simpleType name="zipUnion"> <xsd:union memberTypes="USState listOfMyIntType"/> </xsd:simpleType> <xsd:element name="zips" type="zipUnion"/>
用union来定义一个联合类型,里面的成员类型保罗USState和listOfMyIntType,应用了联合类型的元素的值可以是这些原子类型或列表类型中的一个类型的示例,但是一个元素实例不能同时包含两个类型。
有效的XML文档如下:
<zips>CA</zips> <zips>9192 192391 129</zips> <zips>AK</zips>
无效的XML文档如下:
<zips>AL 2231</zips>
同时包含两个是错误的。
6、匿名类型
前面定义元素类型的时候总是先定义一个数据类型,然后再把元素的type设成新定义的数据类型。如果这个新的数据类型只会用一次,我们就可以直接设置在元素定义里面,而不用另外来设置。
例如:
<xsd:element name="quantity"> <xsd:simpleType> <xsd:restriction base="xsd:positiveInteger"> <xsd:maxExclusive value="100"/> </xsd:restriction> </xsd:simpleType> </xsd:element>
元素quantity的类型就是一个从1~99的整数。对于这种没有用type引入,直接定义在element元素里面的类型,我们称之为匿名类型。
7、复杂类型
复杂类型的定义必须使用complexType元素,在这里可以包含属性和元素。在复杂类型的使用中,主要是complexType和simpleType配合使用。
8、内容模型
内容模型可以对在XML文档内使用的元素、属性和类型进行限制,确定用户可以再XML实例的那些等级添加自己的元素和属性。
1、any内容模型
在XML中声明元素时,any是默认的内容模型,该模型可以包含文本、元素和空格。
例如:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="name"> <xsd:complexType> <xsd:sequence> <xsd:element name="first" type="xsd:string" /> <xsd:element name="middle" type="OtherNames" /> <xsd:element name="last" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="OtherNames"> <xsd:sequence> <xsd:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> </xsd:schema>
例子中xsd:any元素说明该类型允许添加内容。
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="config"> <xs:complexType> <xs:sequence> <xs:element name="module" type="moduleDeclaration" minOccurs="1" maxOccurs="unbounded" /> </xs:sequence> </xs:complexType> <xs:unique name="uniqueModuleName"> <xs:annotation> <xs:documentation> Module name must be unique. </xs:documentation> </xs:annotation> <xs:selector xpath="module"/> <xs:field xpath="@name"/> </xs:unique> </xs:element> <xs:complexType name="moduleDeclaration"> <xs:annotation> <xs:documentation> Module declaration. </xs:documentation> </xs:annotation> <xs:all> <xs:element minOccurs="0" maxOccurs="1" name="sequence" type="moduleSequence"> <xs:unique name="uniqueSequenceName"> <xs:annotation> <xs:documentation> Dependency name must be unique. </xs:documentation> </xs:annotation> <xs:selector xpath=".//*" /> <xs:field xpath="@name" /> </xs:unique> </xs:element> </xs:all> <xs:attribute name="name" type="moduleName" use="required" /> <xs:attribute name="setup_version" type="setupVersion" use="required" /> </xs:complexType> <xs:complexType name="moduleSequence"> <xs:annotation> <xs:documentation> Module dependency root element. </xs:documentation> </xs:annotation> <xs:sequence maxOccurs="unbounded"> <xs:element minOccurs="0" maxOccurs="unbounded" name="module"> <xs:complexType> <xs:annotation> <xs:documentation> Module dependency that represents another module. </xs:documentation> </xs:annotation> <xs:attribute name="name" type="moduleName" use="required" /> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:simpleType name="moduleName"> <xs:annotation> <xs:documentation> Module name attribute can contain only [A-Za-z0-9_]. </xs:documentation> </xs:annotation> <xs:restriction base="xs:string"> <xs:pattern value="[A-Z]+[A-Za-z0-9]{1,}_[A-Z]+[A-Z0-9a-z]{1,}" /> </xs:restriction> </xs:simpleType> <xs:simpleType name="setupVersion"> <xs:annotation> <xs:documentation> Schema version attribute can contain only [0-9.]. </xs:documentation> </xs:annotation> <xs:restriction base="xs:string"> <xs:pattern value="[0-9.]+" /> </xs:restriction> </xs:simpleType> </xs:schema>