Xml Schema类似于DTD,定义了XML文档的逻辑结构,基本功能如下:
a、定义可出现在文档中的元素及元素属性。
b、定义哪个元素是子元素。
c、定义子元素的次序及数目。
d、定义元素是否为空,即是否可包含文本。
e、定义元素和属性的数据类型。
f、定义元素和属性的默认值以及固定值。
Xml Schema也称做Xml Schema Definition,即XSD,schema为其根元素,与DTD相比,Schema是基于XML编写的,扩展性强,功能更强大,而且还支持数据类型和命名空间,也正因为如此,Schema将有可能替代DTD。
简易元素
简易元素指那些仅包含元素文本,不包含任何其它的元素和属性的元素。语法格式如下:
<xs:element name="xxx" type="yyy" default="zzz"/>
xxx是元素名称,yyy是元素类型,zzz设定了元素的默认值,如果把defaut替换为fixed,那么zzz就是元素的固定值。XML Schema定义了一些内建的元素类型如下:
xs:string
xs:decimal
xs:integer
xs:boolean
xs:date
xs:time
等等
属性
简易元素无法拥有属性,拥有属性的元素为复合类型的元素。属性定义格式为:
<xs:attribute name="xxx" type="yyy" default="zzz"/>
xxx是属性名称,yyy是属性类型,zzz设定了属性的默认值,还可以通过fixed设定元素的固定值,属性在默认情况下是可选的,可使用use=”required”设定属性为必选。
限定facet
对于元素或者属性来说,可使用restriction对其进行限定,限定其可接受的值,限定类型有如下内容:
下面是一个简单的例子,限定passwd元素的长度为8:
<xs:element name="passwd">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
复合元素
复合元素指那些包含其它元素或/及属性的元素。
对于下面的复合元素family:
<family>
<name>Smith</name>
<address>China</address>
</family>
在Shema中可使用下面的方式进行定义:
<xs:element name="family">
<xs:complexType>
<xs:sequence base="xs:string">
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
sequence指示了元素声明的顺序。对于上面的例子,复合类型定义只能使用于family元素,不过family元素还可以使用type属性来引用复合类型的名称(这样做的好处是复合类型定义不专属于某个元素,可同时被多个元素使用,还可以被其它的复合类型定义作进一步的扩展):
<xs:element name="family" type="privateinfo"/>
<xs:complexType name="privateinfo">
<xs:sequence base="xs:string">
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
</xs:sequence>
</xs:complexType>
其它的元素使用privateinfo这个复合类型定义:
<xs:element name="school" type="privateinfo"/>
<xs:element name="company" type="privateinfo"/>
对privateinfo复合类型定义扩展为fullprivateinfo:
<xs:element name="company" type="fullprivateinfo"/>
<xs:complexType name="fullprivateinfo">
<xs:complexContext>
<xs:extension base="privateinfo">
<xs:sequence base="xs:string">
<xs:element name="logo" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:comlexContext>
</xs:complexType>
由于只要拥有其它元素或属性的元素即为复合元素,所以复合元素比简单元素要复杂的多,复合元素有几种情况:空元素、包含其它元素的元素、仅包含文本的元素、包含元素和文本的元素。当复合元素同时包含元素和文本时,在Schema中可使用mixed=”true”定义元素内容包含了混合类型。
扩展——
我们可以使用any关键字对XML元素进行扩展,anyAttribute关键字对XML属性进行扩展,也就是说未在Schema中定义的元素或属性是可以在XML中使用的,且可以通过Schema验证。
Schema的扩展性还体现在元素替换,首先声明主元素,然后声明次元素时通过substitutionGroup=”主元素”来指定替换元素,这样在XMl中就可以使用次元素来替换主元素了,有时候又不想让元素被替换,阻止元素替换的方法是元素声明时使用block=”substitution”。
指示器
指示器的作用是控制元素在文档中的使用方式,有7个指示器——
all:规定子元素可以按照任意顺序出现,且每个子元素必须只出现一次。
choice:规定可出现某个子元素或者可出现另外一个子元素,两者选一。
sequence:规定子元素必须按照特定的顺序出现。
maxOccurs:规定某个元素可出现的最大次数。
minOccurs:规定某个元素可出现的最小次数。
group:定义元素组,在group内需要使用all、choice或sequence指定元素顺序,通过ref=”groupName”进行引用。
attributeGroup:定义属性组,通过ref=”groupName”进行引用。
Schema实例一般格式
schema文件:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="xxx" xmlns="yyy" elementFormDefault="qualified">
<xs:element name="passwd">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:schema>
xs:schema为根元素。
xmlns:xs=”http://www.w3.org/2001/XMLSchema”指定了schema中的元素和数据类型来自哪个命名空间,同时还规定了使用前缀xs。
targetNamespace=”xxx”指定schema中定义的元素来自哪个命名空间。
xmlns=”yyy”指定默认的命名空间。
elementFormDefault=”qualified”指定XML实例文档使用schema中定义的元素时必须被命名空间限定。
在XML文件中引用schema:
<?xml version="1.0"?>
<passwd xmlns="aaa" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi="bbb">
abcdefgh
</passwd>
xmlns=”aaa”规定了默认的命名空间。 xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”规定了Schema实例命名空间。 xsi=”bbb”指定Schema文件的命名空间及位置。