如同 DTD 一样,XML Schema 也是一种用于定义和描述 XML 文档结构和内容的模式语言,其出现的目的是为了克服 DTD 的局限性,比如 XML DTD 并不能很好地实现应用程序的不同模块间的相互协调,缺少对文档结构、属性、数据类型等约束的足够描述等,并为 XML 文档提供更丰富的语法结构。另外, XML DTD 不使用 XML 语法,采用的完全是另外一种专用的表示方法,并且对类型和名称空间仅提供有限的支持。W3C 希望以 XML Schema 来作为 XML 模式描述语言的主流,并逐渐代替 XML DTD。
1.6.1 XML Schema 与 DTD 的比较
XML Schema 相比 XML DTD,具有如下一些显著优点:
(1)XML Schema 符合 XML 语法结构,XML Schema 文件本身也是一种 XML 文档,所以,XML 用户很容易理解 XML Schema 的语法格式。
(2)一些常用的 XML API,例如 DOM 和 SAX,它们只能处理 XML 实例文档,并没有提供解析 XML DTD 文档内容的功能,无法通过 DOM 和 SAX 来得到 DTD 中的描述信息。如果一些应用程序需要得到 DTD 本身的描述内容和结构,例如使用关系数据库来存储 XML 文档中的数据时,就涉及如何将 XML DTD 映射为关系模式的问题。由于没有创建和访问 DTD 的标准编程接口,无法使用标准的编程方式来操作 DTD 文档;为了实现对 XML DTD 的解读,研究人员必须为 XML DTD 开发新的接口或者专用工具。由于 XML Schema 本身就是一个 XML 文档,可以使用通用的 XML 解析器解析它,例如,使用 DOM、SAX 或 JDOM 等 XML API 就可以很容易解析出 XML Schema 文档中的内容。所以,XML 的编辑工具、API 开发包及语法分析器都可以直接用于处理 XML Schema 文件。
(3)XML 有非常高的合法性要求,XML DTD 和 XML Schema 都用于对 XML 文档进行描述,都被用作验证 XML 合法性的基础。但是,XML DTD 本身的合法性的验证必须采用另外一套机制,XML Schema 则采用与 XML 文档同样的额合法性验证机制。
(4)XML Schema 对名称空间支持得非常好,而 XML DTD 几乎不支持名称空间。
(5)DTD 支持的数据类型非常有限,在大多数应用环境下都显得能力不足。例如,DTD 可以指定一个元素中必须包含字符文本(PCDATA),但无法指定一个元素中必须包含非负整数之类的类型;而 XML Schema 比 XML DTD 支持更多的数据类型,并支持用户自定义新的数据类型。
(6)DTD 定义约束的能力也非常有限,无法对 XML 实例文档做出更细致的语义限制,例如,无法很好地指定一个元素中的某个子元素必须出现7到12次;而 XML Schema 定义约束的能力非常强大,可以对 XML 实例文档做出细致的语义限制。
(7)在将关系数据表示为 XML 数据和实现基于关系数据库的 XML 数据存储、查询和更新等问题上,XML Schema 基本满足关系模式在数据描述上的需要,比 XML DTD 更适合描述关系数据。
当然,XML Schema 也有一些缺陷,例如,不能像 XML DTD 一样定义实体,XML Schema 比 DTD 更复杂。一般的用户无需自己编写 XML Schema 文档,作为通常的学习和应用需要,读者只需要知道 XML Schema 与 XML DTD 所实现的基本功能和目的是一样的,而不用去考虑两者的语法格式的显著区别。
1.6.2 一个 XML Schema 例子
XML Schema 文件称为模式文档,而采用某个 XML Schema 文档作为约束模式的 XML 文档称为实例文档,XML Schema 模式文档的扩展名通常为 .xsd。下面的例子是一个采用 XML Schema 作为其模式文档的 XML 实例文档,对于其中目前还没有讲解的细节,暂且不用理会。
例子:xmlbook.xml
<?xml version="1.0" encoding="UTF-8"?>
<书架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="xmlbook.xsd">
<书>
<书名>JavaScript 网页开发</书名>
<作者>张孝祥</作者>
<售价>28.00 元</售价>
</书>
</书架>
xmlbook.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://wwww.w3.org/2001/XMLSchema">
<xs:element name='书架'>
<xs:complexType>
<xs:sequence maxOccurs='unbounded'>
<xs:element name='书'>
<xs:complexType>
<xs:sequence>
<xs:element name='书名' type='xs:string' />
<xs:element name='作者' type='xs:string' />
<xs:element name='售价' type='xs:string' />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
下面是对 xmlbook.xsd 文件内容的解释:
(1)<schema> 元素为所有 XML Schema 模式文档的根元素,它用于声明该 XML 文档是一个 XML Schema 模式文档。
(2)由于 XML Schema 模式文档本身也是一个 XML 文档,它们里面的词汇都是含有特定含义和作用的,这些词汇来自另外一个统一规定的模式文档,该模式文档的名称空间为 "http://wwww.w3.org/2001/XMLSchema"。在 xmlbook.xsd 中,将该名称空间定义成使用 xs 前缀名来代表,所以,有关元素前都增加了 xs 前缀。关于名称空间的细节,稍后将进行详细讲解。
(3)模式文档中的每一个 <element> 元素用于定义实例文档中的一个元素,<element> 元素可以是不包含任何子元素的空元素的形式,也可以是包含子元素的成对标签的形式。<element> 元素定义的实例文档中的每个元素都对应一种类型,这个类型通过 <element> 元素的 type 属性来指定。
(4)如果模式文档中的 <element> 元素所定义的实例文档中的元素包含子元素或者具有属性,那么,这个元素的类型即为复杂类型。在模式文档中必须使用 <complexType> 元素来定义复杂类型,复杂类型的定义可以直接嵌套在相关的 <element> 元素中,也可以在 <element> 元素的外部进行定义,然后在 <element> 元素中使用 type 属性来进行引用。在 <complexType> 元素中可以为它所定义的元素类型指定子元素和属性,其中用于声明子元素的语句必须嵌套在 <sequence>、<choice>等标签内。<sequence>、<choice> 等标签用于表示子元素的各种组合关系,例如,<sequence> 标签用于说明各个子元素在实例文档中的出现顺序必须与它们在模式文档中声明时的顺序一致,<choice> 用于说明在实例文档内只需出现其中声明的各个子元素之中的任何一个。注意,即使 <complexType> 元素中定义的子元素只有一个,那也必须将声明子元素的语句嵌套在<sequence>、<choice> 等标签内。
(5)<sequence> 元素中的 maxOccurs=‘unbounded’ 属性设置用于说明嵌套在 <sequence> 元素中的子元素定义可以在 XML 实例文档中出现多次,上不封顶。
====== 以上内容来源于 张孝祥老师的《深入体验Java Web开发内幕 》,记录下来,只作为个人读书笔记。===========