1.什么是Schema
XML Schema是用一套预先规定的XML元素和属性创建的,这些元素和属性定义了XML文档的结构和内容模式。
XML Schema规定XML文档实例的结构和每个元素/属性的数据类型。
2.为什么需要Schema
弥补DTD的局限性
Schema的新特性
一致性:XML Schema 基于XML基本语法规则定义其文档结构;继承了XML的自描述性和可扩展性。
完备性:引入了数据类型(并可自定义数据类型)、命名空间,支持对其他 XML Schema 的引用,具备较强的模块性;
规范性和准确性:XML Schema提供了更加规范和完备的机制来约束XML文档。
面向对象特征:XML Schema中引入了许多成熟的面向对象机制(比如继承性和多态性)。
扩展性:XML Schema 提供了一些扩展机制,允许在事先无法准确描述数据模式的情况下,在XML实例数据中根据需要添加相关的数据。
3.Schema的文档结构
XML Schema 文件的后缀名通常为 .xsd
XML Schema 文件是一个特殊的 XML 文件
1 <?xml version="1.0" encoding="UTF-8"?>
2 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" >
3 <xs:element name="student" type="Student"/>
4 <xs:complexType name="Student">
5 <xs:sequence>
6 <xs:element name="name" type="xs:string"/>
7 <xs:element name="gender" type="Gender"/>
8 <xs:element name="no" type="xs:string"/>
9 <xs:element name="teliphone" type="Telenum"/>
10 <xs:element name="age" type="xs:nonNegativeInteger"/>
11 <xs:element name="gpa" type="xs:int" minOccurs="0"/>
12 </xs:sequence>
13 </xs:complexType>
14 <xs:simpleType name="Gender">
15 <xs:restriction base="xs:string">
16 <xs:enumeration value="Female"/>
17 <xs:enumeration value="Male"/>
18 </xs:restriction>
19 </xs:simpleType>
20 <xs:simpleType name="Telenum">
21 <xs:restriction base="xs:string">
22 <xs:pattern value="(d{4}-d{8})|(d{3}-d{8})|(d{4}-d{7})"/>
23 </xs:restriction>
24
25 </xs:simpleType>
26 </xs:schema>
与Schema建立关联的XML文档:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Student.xsd">
3 <name>XiaoMing</name>
4 <gender>Male</gender>
5 <no>123</no>
6 <teliphone>011-12345678</teliphone>
7 <age>20</age>
8 </student>
4.Schema的数据结构
XML Schema 中的数据类型主要是针对XML元素而言的。
简单类型:不包含任何子元素和属性的元素,只能包含文本内容或是不包含文本的空元素
--内置数据类型
基本数据类型 Primitive Datatype
派生数据类型 Drived Datatype
--用户自定义的数据类型(通过simpleType定义)
复杂类型:包含子元素和/或属性的元素,也可包含文本内容(通过complexType定义)。
4.1 XML Schema 中用户自定义的简单数据类型
a) 通过限制(restriction)派生简单数据类型
b)
通过限制(restriction)派生简单数据类型
c) 通过合并派生简单数据类型
4.2 复杂数据类型
复杂数据类型的几种情况
① 空元素(只包含属性、不包含子元素和文本内容)
② 只包含子元素,不包含文本内容(可能包含属性)
子元素的声明必须放在某个容器中,而不能直接出现在 xs:complexType 元素中,即使是只有一个子元素。
如果有属性,属性声明必须放在所有子元素声明之后。③ 只包含文本内容和属性,不包含子元素
对于这种类型的元素,只包含简单内容(文本和属性),声明时,XML Schema中引入了一个新的元素simpleContent(用于表示“文本”、或者“文本+属性”)。
④ 同时包含子元素和文本(可能包含属性)
定义这种复杂数据类型,要使用complexType的mixed属性。
如果有属性,属性声明必须放在所有子元素声明之后。