XML - Schema

来源:互联网 发布:逆波兰表达式c语言算法 编辑:程序博客网 时间:2024/05/19 10:54

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文件的命名空间及位置。

1 0
原创粉丝点击