XML Schema
用于定义和描述XML文档结构
为了克服DTD的局限性
1.符合XML语法结构(自己就是一个XML文档)
2.DOM,SAX等XML API很容易解析出XML Schema文档中的内容
3.对名称空间支持的非常好
4.比XML DTD支持更多的数据类型,并支持用户自定义新的数据
5.定义约束的能力非常强大,可以对XML实例文档作出细致的语义限制
6.不能像DTD一样定义实体,比DTD更复杂,是w3c组织标准,取代DTD
Schema快速入门
1.XML Schema文件自身就是一个XML文件,但它的扩展名通常为xsd
2.XML Schema文档通常称之为模式文档(约束文档),遵循这个文档写的xml文件称为实例文档
3.一个XML Schema文档也必须有一个根节点,名称为Schema
4.编写了一个XML Schema约束文档后,通常需要把这个文件中声明的元素绑定到一个URI地址上,在XML Schema技术中有一个专业术语来描述这个过程,即把XML Schema文档声明的元素绑定到一个名称空间上,以后XML文件就可以通过这个URI(名称空间)来告诉解析引擎,xml文档中编写的元素来自哪里,被谁约束
在XMLSchema中,每个约束模式文档都可以被赋以一个唯一的名称空间,名称空间用一个唯一的URI(Uniform Resource Identifier统一资源标识符)表示,在xml文件中书写标签时可以通过名称空间声明(xmlns),来声明当前编写的标签来自哪个Schema约束文档
<itcast:书架 xmlns:itcast=”http://www.itcast.cn”></itcast>
此处使用itcast来指向声明的名称,以便于后面对名称空间的引用
http://www.itcast.cn实际上没有指向任何文件,只是一个分配的名字
为了在XML文档中声明它所遵循的Schema文件的具体位置,通常需要在xml文档中的根节点中使用schemaLocation属性来指定
<itcast:书架 xmlns:itcast=http://www.xxxxx.cn
xmlns=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation=”http://www.itcast.cnbook.xsd”>
schemaLocation属性有2个值http://www.xxxxx.cn是需要使用的命名空间 book.xsd是供命名空间使用的XML schema的位置,两者用空格分隔
使用schemaLocation属性时,来自哪里:xmlns=http://www.w3.org/2001/XMLSchema-instance
简单说 就是 book.xsd里能写的元素放在xmlns=http://www.w3.org/2001/XMLSchema-instance这个最大的名称空间里
XML能写的元素放在http://www.xxxxx.cn的名称空间里 约束在book.xsd里
可以引入多个XMLschema空间或不使用名称空间
Schema语法详解和案例
XSD简单元素
只包含文本的元素,不会包含任何其他元素或属性
文本可以是XML Schema定义中包括的类型中的一种(布尔,字符串,数据...)
可以添加限定(facets)
<xs:element name=”xxx”type=”xs:yyy”>
简易元素的默认值default=”xxx“(缺省值为xxx)和固定值fixed=”yyy”
XSD属性
所有属性均被作为简易类型来声明
简易元素无法拥有属性 元素拥有属性就是符合类型(原因上一行)
<xs:attribute name=”xxx” type=”xs:yyy”>嵌套在标签里
属性的默认值(缺省值default)固定值(fixed)
必需(use=”required”)一般为可选的
XSD限定(Facets)
限定(restriction)用于为XML元素或属性定义可接受的值
<xs:restriction base=”xs:integer”/>
<xs:minInclusivevalue=”0”/>
<xs:maxInclusivevalue=”120”/>
</restriction>
限定类型为integer,0-120之间
XML元素限制为一组可接收的值,用枚举约束(enumeration constraint)
<xs:enumeration value=”xxx”/>*n个枚举值
限制定义为一系列可被使用的数字或字母,用模式约束(pattern constraint)
<xs:pattern value=”[a-z]”/>a-z之中一个
<xs:pattern value=”[a-z][a-z][a-z]”/>3个a-z中的值
[a-z]* 0到多个a-z [a-z]+ 1到多个a-z
male | female 二选一 [a-zA-Z0-9]{8} 8位a-zA-Z或0-9
其他看w3c的XML Schema文档
XSD复杂(复合)元素
包含了其他的元素及/或属性XML元素
四种类型:空元素
包含其他元素的元素
仅包含文本的元素
包含元素和文本的元素
上述元素均可包含属性
XML Schema有两种方式定义复合元素
1.通过命名此元素直接声明
2.声明属性再给元素赋给属性
可以给复合元素属性为复合元素添加另一复合元素的内容
XSD空元素
空的复合元素不能包含内容 只能包含属性
XSD类型指示器
通过指示器,我们可以指定元素在文档中被使用的方式
七种指示器
Order指示器定义元素的顺序
All Choice(非此即彼) Sequence(必须按特定顺序出现)
Occurrence指示器定义某个元素出现的频率
maxOccurs minOccurs (默认值均为1)
Group指示器:Group name attributeGroupname
一个实例
<?xmlversion="1.0" encoding="ISO-8859-1" ?>
<xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:elementname="shiporder">
<xs:complexType>
<xs:sequence>
<xs:element name="orderperson"type="xs:string"/>
<xs:element name="shipto">
<xs:complexType>
<xs:sequence>
<xs:element name="name"type="xs:string"/>
<xs:element name="address"type="xs:string"/>
<xs:element name="city"type="xs:string"/>
<xs:element name="country"type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="item"maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="title"type="xs:string"/>
<xs:element name="note"type="xs:string" minOccurs="0"/>
<xs:element name="quantity"type="xs:positiveInteger"/>
<xs:element name="price"type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="orderid"type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>