
3.3.2 XML Schema
因为XML Schema比起DTD语法要复杂许多,所以我们只涉及其基本知识。更多信息请参考http://www.w3.org/TR/xmlschema-0上的指南。
如果要在文档中引用Schema文件,需要在根元素中添加属性,例如:

这个声明说明Schema文件config.xsd会被用来验证该文档。如果使用命名空间,语法就更加复杂了。详情请参见XML Schema指南(前缀xsi是一个命名空间别名(namespace alias),请查看第3.5节以了解更多信息)。
Schema为每个元素都定义了类型。类型可以是简单类型,即有格式限制的字符串,或者是复杂类型。一些简单类型已经被内建到了XML Schema内,包括:

注意:我们用前缀xsd:来表示XSL Schema定义的命名空间。一些作者代之以xs:。
可以定义自己的简单类型。例如,下面是一个枚举类型:

当定义元素时,要指定它的类型:

类型约束了元素的内容。例如,下面的元素将被验证为具有正确格式:

但是,下面的元素会被解析器拒绝:

FontType是name、size和style元素的序列。在这个类型定义中,我们使用了ref属性来引用在Schema中位于别处的定义。也可以嵌套定义,像这样:


请注意style元素的匿名类型定义。
xsd:sequence结构和DTD中的连接符号等价,而xsd:choice结构和|操作符等价,例如:

这和DTD中的类型email|phone类型是等价的。
如果要允许重复元素,可以使用minoccurs和maxoccurs属性,例如,与DTD类型item*等价的形式如下:

如果要指定属性,可以把xsd:attribute元素添加到complexType定义中去:

这与下面的DTD语句等价:

可以把Schema的元素和类型定义封装在xsd:schema元素中:

解析带有Schema的XML文件和解析带有DTD的文件相似,但有3点差别:
1)必须打开对命名空间的支持,即使在XML文件里你可能不会用到它。

2)必须通过如下的“魔咒”来准备好处理Schema的工厂。

3)解析器不会丢弃元素中的空白字符,这确实很令人恼火,关于这是否是一个bug,人们看法不一。有一种变通方法,请参看程序清单3-4中的代码。