1 简介
Schema使用XML文档一致的规范方式来对定义其他XML文档结构,较DTD方式优势更多,如:数据类型丰富、格式语法与XML文档一致、可以对数据类型进行扩展和限制、同命名空间结合更为紧密(使得一个XML文件可以有多个对应的Schema)
可以将XML文件的Schema文件保存为xsd文件。
此时,Schema文件的引用方式有固定的格式
如Schema文件为:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="students">
<xs:complexType>
<xs:sequence>
<xs:element name="student" type="xs:string" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
相应的XML文件为:
<?xml version="1.0" encoding="UTF-8"?>
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:n>
<student>a</student>
<student>b</student>
</students>
2 基本元素
2、1 Schema根元素
任何Schema文档的元素都是Schema根元素的子元素,其中的xmlns:xs用于表示Schema元素来源的名称空间,如:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
2、2 简单元素
不包含子元素和属性,使用element来声明,type属性为数据类型,如:
<xs:element name="birthday" type="xs:date"/>
2、3 包含子元素的元素
包含子元素和属性,使用element来声明,无需指定type属性,如:
<xs:element name="sgrade">
<xs:complexType>
<xs:sequence>
<xs:element ref="number"/>
<xs:element ref="course"/>
<xs:element ref="grade"/>
</xs:sequence>
</xs:complexType>
</xs:element>
也可以使用复合自定义数据类型来表示,如:
<xs:complexType name="newtype">
<xs:sequence>
<xs:element ref="number"/>
<xs:element ref="course"/>
<xs:element ref="grade"/>
</xs:sequence>
</xs:complexType>
<xs:element name="sgrade" type="newtype">
2、4 通过元素引用声明的元素
通过ref属性表示引用其他地方已经声明的元素,这个被引用元素必须是Schema元素的直接子元素,通过元素引用声明的元素与被引用元素数据类型相同,如:
<xs:element ref="number"/>
2、5 空元素
内容为空,且没有子元素,使用element来声明,由于没有子元素,所以通常使用属性来表示,如:
<xs:element name="otherNullElement">
<xs:complexType>
<xs:attribute name="XX"/>
</xs:complexType>
</xs:element>
如果空元素连属性都没有,可以如下表示:
<xs:element name="otherNullElement" nillable="true"/>
2、6 声明混合内容的元素
既可以在元素内放入子元素,也可以放入数据,利用complexType的mixed属性设置为真来表示,如:
<xs:element name="newone">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="xsname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
完整的使用方法为:
<?xml version="1.0" encoding="gb2312" standal?>
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:n>
<stu>
<number>000001</number>
<name>黎明</name>
<sex>1</sex>
<birthday>1976-11-23</birthday>
<height>1.8</height>
<newone>
This is demo
<xsname>Null</xsname>
</newone>
<sgrade>
<number>000001</number>
<course>A03</course>
<grade>56</grade>
</sgrade>
<sgrade>
<number>000001</number>
<course>B01</course>
<grade>78</grade>
</sgrade>
</stu>
</students>
相应的Schema文件为stu.xsd,内容为:
<?xml version="1.0" encoding="UTF-8"?>
<!--W3C Schema generated by XMLSPY v5 rel. 4 U (http://www.xmlspy.com)-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="newone">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="xsname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="birthday" type="xs:date"/>
<xs:element name="course">
<xs:simpleType>
<xs:restriction base="xs:hexBinary">
<xs:enumeration value="A03"/>
<xs:enumeration value="B01"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="grade">
<xs:simpleType>
<xs:restriction base="xs:byte">
<xs:enumeration value="56"/>
<xs:enumeration value="78"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="height" type="xs:decimal"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="number" type="xs:byte"/>
<xs:element name="sex" type="xs:boolean"/>
<xs:complexType name="sgradeType">
<xs:sequence>
<xs:element ref="number"/>
<xs:element ref="course"/>
<xs:element ref="grade"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="stuType">
<xs:sequence>
<xs:element ref="number"/>
<xs:element ref="name"/>
<xs:element ref="sex"/>
<xs:element ref="birthday"/>
<xs:element ref="height"/>
<xs:element ref="newone"/>
<xs:element name="sgrade" type="sgradeType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:element name="students">
<xs:complexType>
<xs:sequence>
<xs:element name="stu" type="stuType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
2、7 使用ANY内容的元素
这种元素可以出现任何内建数据类型数据和自定义数据类型数据
<xs:element name="newone"/>
有些声明可以写为:
<xs:element name="newone" type="xs:anytype"/>
2、8 元素出现的限制
类似于DTD中的元素出现限制符号,Schema使用element元素的minOccurs属性和maxOccurs属性来控制元素的出现次数,minOccurs属性决定最小出现次数,maxOccurs属性决定最大出现次数,它们的值为非负整数,或者为“unbounded”表示不限制次数,默认都为1。
default属性指定默认值,如果不存在该元素,不进行处理
fixed属性指定元素值必须为fixed属性的值,如果不存在该元素,则自动创建该元素并赋此值
注意:default属性和fixed属性不能同时对同一个元素设置,它们是彼此矛盾的
2、9 元素出现的顺序
Schema使用sequence元素和all元素来控制子元素的出现顺序,sequence元素中的子元素必须按照声明的顺序出现在XMl文档中,all元素中的子元素可以按任意顺序出现在XMl文档中,但是此时这些元素的maxOccurs必须为1,而且这些子元素是独立的而不是元素组。
2、10 选择型子元素
使用choice来声明选择型的子元素,实际使用时从多个子元素的定义中选取一个而且只能是一个子元素。
如:
<xs:element name="newone">
<xs:complexType>
<xs:choice>
<xs:element name="xsname1" type="xs:string"/>
<xs:element name="xsname2" type="xs:string"/>
<xs:element name="xsname3" type="xs:string"/>
</xs:choice>
</xs:complexType>
</xs:element>
相应的XML文档为:
<newone>
<xsname2>Null</xsname2>
</newone>
2、11 声明元素组
可以同时声明一组元素并一齐用于其他元素内部子元素的声明上,如一般没有使用元素组的声明为:
<xs:element name="newone">
<xs:complexType>
<xs:sequence>
<xs:element name="xsname1" type="xs:string"/>
<xs:element name="xsname2" type="xs:string"/>
<xs:element name="xsname3" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
使用元素组的声明为:
<xs:group name="threeNode">
<xs:sequence>
<xs:element name="xsname1" type="xs:string"/>
<xs:element name="xsname2" type="xs:string"/>
<xs:element name="xsname3" type="xs:string"/>
</xs:sequence>
</xs:group>
<xs:element name="newone">
<xs:complexType>
<xs:sequence>
<xs:group ref="threeNode"/>
</xs:sequence>
</xs:complexType>
</xs:element>
相应的XML文件为:
<newone>
<xsname1>Null</xsname1>
<xsname2>Null</xsname2>
<xsname3>Null</xsname3>
</newone>
2、12 ANY元素
可以替换为任意类型的元素,如:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:any minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="children">
<xs:complexType>
<xs:sequence>
<xs:element name="childname" type="xs:string" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
相应的XML文件为:
<?xml version="1.0" encoding="UTF-8"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:n>
<firstname>Hege</firstname>
<lastname>Refsnes</lastname>
<children>
<childname>Cecilie</childname>
</children>
</person>
3 属性
3、1 元素属性
使用attribute元素实现,属性数据类型为简单类型,没有复杂类型,因为不存在包含子元素或者属性的属性,放入的位置一般在complexType中,通常位于子元素的声明后,如:
<xs:element name="newone">
<xs:complexType>
<xs:sequence>
<xs:element name="newnode" type="xs:string"/>
</xs:sequence>
<xs:attribute name="someattr" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
相应的XML文件为:
<newone someattr="values">
<newnode>Null</newnode>
</newone>
虽然属性没有复杂数据类型,但是可以是用户自定义的简单类型,如:
<xs:element name="newone">
<xs:complexType>
<xs:sequence>
<xs:element name="newnode" type="xs:string"/>
</xs:sequence>
<xs:attribute name="someattr">
<xs:simpleType >
<xs:restriction base="xs:string">
<xs:enumeration value="1"/>
<xs:enumeration value="2"/>
<xs:enumeration value="3"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
相应的XML文件为:
<newone someattr="1">
<newnode>Null</newnode>
</newone>
3、2 通过引用声明属性
上述代码中的属性可以分开单独定义,通过引用来声明属性,如:
<xs:element name="newone">
<xs:complexType>
<xs:sequence>
<xs:element name="newnode" type="xs:string"/>
</xs:sequence>
<xs:attribute ref="someattr"/>
</xs:complexType>
</xs:element>
<xs:attribute name="someattr">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="1"/>
<xs:enumeration value="2"/>
<xs:enumeration value="3"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
相应的XML文件为:
<newone someattr="1">
<newnode>Null</newnode>
</newone>
3、3 声明any内容的属性
声明为any的属性可以使得在元素中出现任何已经声明过的属性,如:
<xs:element name="newone">
<xs:complexType>
<xs:sequence>
<xs:element name="newnode" type="xs:string"/>
</xs:sequence>
<xs:anyAttribute/>
</xs:complexType>
</xs:element>
3、4 声明属性分组
利用属性分组可以将许多属性集中建立和被引用,如:
<xs:attributeGroup name="comattr">
<xs:attribute name="gender">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="male|female"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="someattr">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="1"/>
<xs:enumeration value="2"/>
<xs:enumeration value="3"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:attributeGroup>
相应的XML文件为:
<xs:element name="newone">
<xs:complexType>
<xs:sequence>
<xs:element name="newnode" type="xs:string"/>
</xs:sequence>
<xs:attributeGroup ref="comattr"/>
</xs:complexType>
</xs:element>
3、5 属性出现的限制
属性只能出现或者不出现,不能出现多次的情况。可以attribute使用元素的use属性指定,它的值有required、optional、prohibited,分别代表了必需、可选和禁止。
另外,还有两个常见属性,如:
default属性给出缺省值,当属性不出现时,将自动加上该属性并赋予默认值。
fixed属性指定必须为此值,当属性不出现时,将自动加上该属性并赋予固定值。
4 数据类型
4、1 内建数据类型
标准XML中有44种数据类型,其中19种为基本类型,25种为派生数据类型
4、2 自定义数据类型
4、2、1 facets
自定义数据类型有面(facets)组成,其中的constraining facets可以用于定义数据类型,其中的主要元素有六个:
下面的内容基于如下文档,Schema文件为:
<?xml version="1.0" encoding="UTF-8" standal?>
<!--W3C Schema 由 XMLSpy v2006 U 创建 (http://www.altova.com)-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="name">
<xs:simpleType>
<xs:restriction base="xs:string">
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="number">
<xs:simpleType>
<xs:restriction base="xs:string">
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:complexType name="studentType">
<xs:sequence>
<xs:element ref="number"/>
<xs:element ref="name"/>
</xs:sequence>
</xs:complexType>
<xs:element name="students">
<xs:complexType>
<xs:sequence>
<xs:element name="student" type="studentType" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XML文件为:
<?xml version="1.0" encoding="UTF-8"?>
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:n>
<student>
<number>000001</number>
<name>黎明</name>
</student>
<student>
<number>000002</number>
<name>赵怡春</name>
</student>
<student>
<number>000003</number>
<name>张富平</name>
</student>
<student>
<number>000004</number>
<name>白丽</name>
</student>
<student>
<number>000005</number>
<name>牛玉德</name>
</student>
<student>
<number>000006</number>
<name>姚华</name>
</student>
<student>
<number>000007</number>
<name>李南</name>
</student>
</students>
1)length
用于定义长度,一般基于字符串类型的数据,如果fixed属性为true,则限制长度必须为规定长度,如:
<xs:simpleType name="newtype">
<xs:restriction base="xs:string">
<xs:length value="6" fixed="true"/>
</xs:restriction>
</xs:simpleType>
基于此数据类型的其他元素可以表达为:
<xs:element name="number">
<xs:simpleType>
<xs:restriction base="newtype">
</xs:restriction>
</xs:simpleType>
</xs:element>
2)maxLength minLength
限制数据类型内容的最大和最小长度,注意它们与length不能同时使用,如:
<xs:simpleType name="newtype">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="6"/>
</xs:restriction>
</xs:simpleType>
3)pattern
使用正则表达式来限定内容式样,如必须为六个数字:
<xs:simpleType name="newtype">
<xs:restriction base="xs:string">
<xs:minLength value="6"/>
<xs:maxLength value="6"/>
<xs:pattern value="\d{6}"/>
</xs:restriction>
</xs:simpleType>
另外,下面表示前面三个数字,加一个分隔符,再加两个大写字母
<xs:pattern value="\d{3}-[A-Z]{2}"/>
4)enumeration
用来限制取值的范围集合,如:
<xs:simpleType name="newtype">
<xs:restriction base="xs:string">
<xs:minLength value="6"/>
<xs:maxLength value="6"/>
<xs:pattern value="\d{6}"/>
<xs:enumeration value="000001"/>
<xs:enumeration value="000002"/>
<xs:enumeration value="000003"/>
<xs:enumeration value="000004"/>
<xs:enumeration value="000005"/>
<xs:enumeration value="000006"/>
<xs:enumeration value="000007"/>
</xs:restriction>
</xs:simpleType>
5)whitespace
用于处理数据中的空白,如:
<xs:simpleType name="newtype">
<xs:restriction base="xs:string">
<xs:minLength value="6"/>
<xs:maxLength value="6"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
value属性为collapse表示去掉首尾空格,并合并多个连续空格
value属性为preserve表示不对空格作任何处理
value属性为replace表示所有的制表符、换行和回车都用空格替代
此时下面的XML格式正确,如:
<student>
<number>01 003</number>
<name>张富平</name>
</student>
6)maxInclusive minInclusive
用于指定数据内容的范围,分别为最大值和最小值
4、2、2 派生数据类型
分为简单类型和复杂类型,前者只能包含字符数据,不能有子元素和属性,后者相反。内建类型都是简单类型,自定义类型可以是复杂类型。
4、2、2、1 派生简单数据类型
基本结构为:
<xs:simpleType name="newtype">
<xs:restriction base="xs:string">
facets...
</xs:restriction>
</xs:simpleType>
使用多个简单类型可以合并为一个简单类型,如:
<xs:simpleType name="newtype1">
<xs:restriction base="xs:string">
<xs:minLength value="3"/>
<xs:maxLength value="3"/>
<xs:whiteSpace value="replace"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="newtype2">
<xs:restriction base="xs:string">
<xs:minLength value="6"/>
<xs:maxLength value="6"/>
<xs:whiteSpace value="replace"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="newtype">
<xs:union memberTypes="newtype1 newtype2"/>
</xs:simpleType>
相应的XML文件为:
<?xml version="1.0" encoding="UTF-8"?>
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:n>
<student>
<number>112</number>
</student>
<student>
<number>000002</number>
</student>
</students>
上述合并写法也可以为:
<xs:simpleType name="newtype">
<xs:union>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="3"/>
<xs:maxLength value="3"/>
<xs:whiteSpace value="replace"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="6"/>
<xs:maxLength value="6"/>
<xs:whiteSpace value="replace"/>
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
也可以使用列表类型,可以用于取各种枚举值,如:
<xs:simpleType name="newtype">
<xs:list itemType="xs:integer"/>
</xs:simpleType>
相应的XML文件为:
<student>
<number>112 32</number>
</student>
4、2、2、2 派生复杂数据类型
可以包含子元素和属性,可以通过扩展已有的简单数据类型和复合类型来实现。
对于扩展已有的简单数据类型,可以增加新的属性,如:
<xs:complexType name="newtype">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="length" type="xs:integer" use="required"></xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:element name="number" type="newtype">
</xs:element>
相应的XML文件为:
<student>
<number length="6">000001</number>
<name>黎明</name>
</student>
<student>
<number length="6">000002</number>
<name>赵怡春</name>
</student>
对于复合类型可以包含多种其他类型,如:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="student">
<xs:complexType>
<xs:sequence>
<xs:element name="number" type="xs:string">
</xs:element>
<xs:element name="name" type="xs:string">
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="students">
<xs:complexType>
<xs:sequence>
<xs:element ref="student" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
也可以写成分离的数据类型定义方式,如:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:complexType name="newtype">
<xs:sequence>
<xs:element name="number" type="xs:string">
</xs:element>
<xs:element name="name" type="xs:string">
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="student" type="newtype">
</xs:element>
<xs:element name="students">
<xs:complexType>
<xs:sequence>
<xs:element ref="student" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
相应的XML文件为:
<?xml version="1.0" encoding="UTF-8"?>
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:n>
<student>
<number>000001</number>
<name>黎明</name>
</student>
<student>
<number>000002</number>
<name>赵怡春</name>
</student>
</students>
也可以扩展其他类型,如:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:complexType name="newtype">
<xs:sequence>
<xs:element name="number" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="finalnewtype">
<xs:complexContent>
<xs:extension base="newtype">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="student" type="finalnewtype"/>
<xs:element name="students">
<xs:complexType>
<xs:sequence>
<xs:element ref="student" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
相应的XML文件为:
<?xml version="1.0" encoding="UTF-8"?>
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:n>
<student>
<number>000001</number>
<name>黎明</name>
</student>
<student>
<number>000002</number>
<name>赵怡春</name>
</student>
</students>
[此贴子已经被作者于2010-12-11 19:54:11编辑过]