4.1 DTD和Schema

前一章已经介绍了如何使用DTD来定义语义约束,使用DTD定义语义约束简单易用,但也具有一些很明显的劣势:DTD可以定义XML文档的结构,却无法对XML元素内容进行约束。例如,如果希望某个XML元素的内容只能是日期型的数据,DTD显然就无能为力了。

XML Schema提供了比DTD更强的语义约束,不仅可以定义XML文档的结构,还可以规范文档的内容。可以这样说,DTD能完成的工作,Schema一定可以完成;但Schema可以完成的工作,DTD则不一定可以完成。另外,XML Schema本身就是一个XML文档,其基于标签的语法比DTD的可读性更强。

4.1.1 Schema概述及其优势

XML Schema 是DTD的替代者,它采用标准XML语法来定义XML文档语义约束,不仅可以定义XML文档的结构,还可以定义XML文档内容约束。XML Schema也被称为XML Schema 定义(XML Schema Definition,XSD)。

DTD采用了非XML的语法来描述XML的语义约束,不支持多种多样的数据类型,可扩展性较差,将逐渐为XML Schema所替代。DTD和XML Schema的功能相似,都用于描述XML文档的语义约束,区别是Schema的功能更强大,更符合技术的发展趋势。相对而言,XML Schema具有如下优势:

alt 可读性更好。

alt 支持为元素内容或属性值指定数据类型,功能更完善、更强大。

alt 可针对未来的需求进行扩展。

4.1.1.1 XML Schema可读性更强

XML Schema不像DTD,它本身也是由XML 编写,因此具有XML文档可读性强的特点,所有对XML文档有效的技术都可作用于XML Schema:

alt 可使用XML编辑器来编辑Schema文件。

alt 可使用XML解析器来解析Schema文件。

alt 可通过XML DOM来处理Schema。

alt 可通过XSLT来转换Schema。

alt XML Schema可保护数据通信。

4.1.1.2 XML Schema支持数据类型

XML Schema最重要的能力之一就是支持数据类型,例如对于前面提到的DTD无法满足的需求,使用XML Schema的数据类型则可以很好地解决。不仅如此,Schema甚至可以限制元素或属性的值必须是2008-12-23到2009-03-29之间的日期,当然这需要使用XML Schema的数据约束(data facet)来实现。


alt提示

数据约束,在XML Schema中称为data facet,因此有些图书上翻译为“面”。它主要用于为原有的数据类型增加额外约束,因此笔者将其译为数据约束。


XML Schema提供了大量内建数据类型,例如字符串类型和数值类型等,这些数据类型可以指定XML元素和属性的值只能是特定类型。除此之外,XML Schema还允许“扩展”数据类型。为内建数据类型增加额外限制就可“扩展”出新的数据类型,使用这种方式可以更好地约束XML文档的内容。

4.1.1.3 XML Schema是可扩展的

因为XML Schema本身也是XML文档,因此它是可扩展的。通过可扩展的XML Schema定义,可以满足如下需求:

alt 允许在其他Schema中导入已有的Schema,从而可以更好地复用已有的Schema。

alt 开发者可以扩展自己的数据类型。

alt 允许在同一个XML文档中使用多个XML Schema。

4.1.2 Schema在Java EE中的应用

由于Schema已经逐步取代了DTD,因此Java EE中的各种规范和配置描述也已开始采用Schema来代替DTD作为语义约束。

对于Web应用而言,Servlet 2.3规范依然使用DTD作为语义约束,而从Servlet 2.4开始,Web应用的配置描述文件(web.xml)已开始采用Schema作为语义约束。

Servlet 2.3规范的web.xml文件有如下形式:

alt

而Servlet 2.5规范的web.xml文件则有如下形式:

alt

不仅如此,Spring框架从2.0起也已开始使用Schema作为语义约束。Spring充分利用了XML Schema作为语义约束的优势,允许为Spring配置文件扩展配置元素,从而可以极好地简化对应用组件的配置管理。


alt提示

读者如果需要获取更多关于使用Schema简化Spring配置管理的知识,可以参考“疯狂Java体系”的《轻量级Java EE企业应用实战》7.8节的内容。