其他文章
以下是本系列的另两篇文章:
XML的基本语法
DTD文档格式
DTD的麻烦
使用DTD虽然在指定许可的元素、需要的元素以及给定XML文档中如何组织元素等方面给我们以较大的方便,但是,一旦你想针对特定元素施加数据类型就会遇到麻烦了。DTD规范严格地定义了结构,但只支持相对功能较弱的内容类型规范,而对强制性结构化却无计可施,比如名为Date 的数据如何规定它必须包含有效值呢?
这就要指望XML Schema了,XML Schema目前作为建议已经于2001年提交给了W3C ,这意味着它最终将成为一般用途的建议标准。假如你对此感兴趣,你不妨到W3C网站找些官方文档和内容简介之类的材料来看看。注意,其他schema定义也是有的,包括日本的标准RELAX 和微软公司的XDR。可是,XML Schema是唯一受到W3C成为的建议标准,所以我在这篇文章中只对它进行阐述。
XML Schema不仅可以让你定义XML文档的结构而且还允许你约束文档的内容,这就不同于DTD了。另外,一个 XML Schema自身就是一个XML文档,其基于标签的语法比DTD中的特殊字符要清楚多了。
Schema概述
XML Schema是用一套预先规定的XML元素和属性创建的,这些元素和属性定义了文档的结构和内容模式。相应的一套精巧的规则(这些规则却很有意思的用DTD来表示)指定了每个Schema元素或者属性的合法用途。如果违反这些规则解析器就会拒绝解析你的Schema以及任何同它相联系的文档。
现在让就让我们来看看清单A中显示的XML Schema示例,该例对我们以前在清单B中用到的图书目录进行了说明。清单B有了点小改动:作为根元素的catalog现在有了两个新属性,它们通过清单A中的catalog schema与之关联。
你再看catalog schema,很快你就会注意到它包含了标准的XML头?xml version = "1.0"?,这表示schema自己就是一个XML文档。而任何schema的根元素都必须是schema,它有一个或者多个说明自己的属性。在这种情况下,schema的namespace定义属性(xmlns)会定义名称空间为xs,它将用作文档中所有元素的根名称空间。
什么是名称空间
XML把名称空间定义为包装XML元素在一起供以后重用的方式。为了使用XML文档的名称空间中定义的元素,你必须通过xmlns属性声明你希望采用名称空间。你还必须为该名称空间定义快捷方式的前缀(例如xs:)作为你文档中的根元素,从而使得名称空间在文档中都可用。前缀是用于文档的任何导入名称空间的元素的标识符。这一过程就如同在Visual Basic中给库加索引或者导入模块;C++、Java或者.NET下的名称空间也具有同样的含义。
我们的schema示例中接下来的元素是annotation,它的作用是代表同其父元素有关的文档。annotation可以包含两个子元素之一,或者是documentation或者是appinfo,或者两者都包含进去。前者用于可读的文档,而后者则用来保存供应用程序处理的指令。
接下来我们定义了两个主要的元素(根元素catalog及其子元素book),它们用在书目文档内,后者采用了两个element元素。这些元素都包含了定义名字的属性和各个元素准许的内容。在这种情况下,catalog元素被定义为catalogtype类型,而book元素则被定义为elementtype类型;这两种类型以后还要在schema文档中被定义。
什么是类型?
我已经说过了,XML Schema可以让你把XML文档中的元素声明为特定的类型,准许解析器检查文档的内容及其结构。XML Schem定义了两种主要的数据类型:预定义简单类型和复杂类型。这两种数据类型之间的主要区别是复杂类型可以象数据一样包含其他元素而简单类型则只能包含数据。简单类型给予了XML Schema低级类型检查能力,允许你把元素定义为图A中的任何类型之一。
图A
简单类型
定义
string
字符串数据。
boolean
二元类型的True或者False。
date
历法日期,格式是CCYY-MM-DD。
dateTime
历法日期和时间。
time
24小时格式的时间可根据时区调节。
decimal
任意精度和位数的十进制数。
integer
整数
&nbs