XML Schema学习笔记(一)
XML规范包括DTD(Document Type Definition,文档类型定义)。DTD可用于描述XML标记语言,并检验标记语言实例的有效性。虽然多年来已经证明DTD非常有用,但仍有一定的局限性。为了解决DTD的局限性,W 3C 创建了一种用于描述标记语言的新方法,即XML Schema。
1. XML Schema的优势
读取XML实例的解析器要通过将XML实例与DTD比较来确定实例是否有效。为使XML实例有效,该实例必须符合它的DTD,即必须按正确的顺序和多样性来使用由DTD的元素。同时DTD中只提供了四种的数据类型,即EMPTY、ANY、元素内容和元素与文本的混合内容。
而XML Schema提供了很强的类型系统,包括简单的原始类型以及更为复杂的类型。XML Schema还允许通过扩展或限制简单或者复杂类型来创建新类型。此外,XML模式支持用XML命名空间创建由多种标记语言构成的复合文档。
2. XML Schema文档
Schema以复杂类型和简单类型的方式描述XML文档的结构。复杂类型描述如何组织、嵌套元素;简单类型是由元素和特性包含的原始数据类型。
<?xml version="1.0" encoding="UTF-8"?>
<scheam xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:cs="http://www.Cactus.org/cactus"
targetNamespace="http://www.Cactus.org/cactus">
<element name="address" type="cs:ChinaAddress"/>
<complexType name="ChinaAddress">
<sequence>
<element name="name" type="string"/>
<element name="street" type="string"/>
<element name="city" type="string"/>
<element name="state" type="string"/>
<element name="zip" type="string"/>
</sequence>
</complexType>
</schema>
Schema文档的根元素总是schema元素。元素声明和类型声明嵌套于schema元素中。上述例子中声明了一个名为ChinaAddress的复杂类型和该类型的一个名为address的元素。
2.1 简单类型
简单类型类似于Java原始类型,其中不能再包含其他元素,只能包含数据。
XML Schema内置简单类型
简单类型 | 定义 |
string | 符合UCS的符号序列 |
normalizedString | 没有结束符、开始符和制表位的字符串 |
token | 没有空白、开始符合制表位的字符串 |
NMTKEN | 特性中使用的令牌 |
integer | 任何大小的十进制整数 |
float | 符合IEEE单精度32位浮点类型的小数 |
boolean | 布尔值 |
Time | 以小时、分、秒、毫秒格式表示的时间 |
date | 以世纪、年、月和日格式表示的日期 |
2.2 复杂类型
Schema可以声明复杂类型。复杂类型定义了如何组织包含有其他元素的元素,类似于有字段没有方法的Java类。
2.2.1 元素序列
各模式中的大多数complexType声明均会包含一个列有一个或者多个element元素定义的sequence元素。其中也定义了元素出现的顺序以及每个元素的数据类型。
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:cs="http://www.Cactus.org/cactus"
targetNamespace="http://www.Cactus.org/cactus">
<element name="purchaseOrder" type="cs:PurchaseOrder"/>
<element name="address" type="cs:ChinaAddress"/>
<complexType name="PurchaseOrder">
<sequence>
<element name="accountName" type="string"/>
<element name="accountNumber" type="unsignedShort"/>
<element name="shipAddress" type="cs:ChinaAddress"/>
<element name="billAddress" type="cs:ChinaAddress"/>
<element name="book" type="cs:Book"/>
<element name="total" type="float"/>
</sequence>
</complexType>
<complexType name="ChinaAddress">
<sequence>
<element name="name" type="string"/>
<element name="street" type="string"/>
<element name="city" type="string"/>
<element name="state" type="string"/>
<element name="zip" type="string"/>
</sequence>
</complexType>
<schema>
复杂类型可以建立在其他复杂类型之上,以创建能够方便描述非常复杂的XML结构的丰富类型。
2.2.2 限定元素和非限定元素
可以利用命名空间使元素限定或者非限定,即XML文档中的元素可以有限定名称前缀,也可以没有。但全局元素和全局特性必须总为限定。有个例外,属于默认命名空间的全局元素不需要用前缀来限定。
XML Schema定义了elementFormDefault特性和attributeFormDefault特性,这两个特性用于确定XML实例中的局部元素是否需要前缀来限定。
2.2.3 指定模式的位置
为根据一个或多个Schema检验XML文档,用户需要指定要使用的Schema。通过用schemaLocation特性指定Schema的位置就行。
<?xml version="1.0" encoding="UTF-8"?>
<purchaseOrder xmlns="http://www.Cactus.org/cactus"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.Cactus.org/cactus
http://www.Cactus.org/cactus/po.xsd">
如果需要的话,可以指定若干个Schema。