3.1 XML语义约束
前面在介绍web.xml文件时提到,为Web应用配置一个Servlet的合法配置片段为:
如果仅从提供配置信息的角度来看,完全可以将上面的XML配置片段改为如下形式:
但第2种形式的XML配置文件在实际Web应用中其实是错误的,因为Web服务器(如Tomcat、Resin等)不会读取第2种形式的配置文件里的信息。
学生提问:我一直有一个疑问:XML太“随意”了,我们想怎样定义元素都可以,想怎样嵌套子元素也行,想怎样定义属性也行,真的是这样吗?
答:这个疑问其实是一种深层次的思考,XML文档允许开发者自行扩展元素,但这种扩展其实有一个很“严重”的问题:如果无限制地这样随意使用,那么使用XML的双方将无法准确地交换信息!XML接收者无法理解XML创建者想要表达的意思,例如对于<table>crazyit</table>元素,接收者无法理解该元素到底想表达一张“桌子”,还是想表达一个“表格”。在这种背景下,使用XML进行数据交换的双方就要相互约定一套规则(其作用有点类似于协议),XML创建者按这套规则保存信息,而XML接收者则按这套规则读取信息,这样就可以很好地完成数据交换。这套规则应该以一种独立的形式存在,然后交给XML创建者和XML使用者共同遵守。XML将其称为语义约束,并允许使用DTD或XML Schema来定义。
虽然XML允许开发者自由扩展元素,但在实际使用中,使用XML进行信息交换的双方需要一种更具体的语义约束才能保证有效地进行数据交换。DTD(Document Type Definition,即文档类型定义)就是一种简单易用的语义约束方式。
DTD对XML的约束包括如下几个方面:
定义XML文档的根元素、内容和结构。
定义XML文档里可以接受哪些元素。
定义XML文档里每个元素能接受的合法内容:包括是否为空,是否可包含文本,可接受哪些子元素,子元素之间的顺序和子元素出现的次数等。
定义XML文档中每个元素能接受哪些属性。
定义XML文档里每个属性的类型,能接受哪些值,以及元素对属性的约束等。
定义属性的默认值和固定值。
定义XML文档或DTD中可使用的实体。
归纳起来,DTD具有如下几方面的作用:
DTD采用了非XML的语法来描述语义约束,可以提供如下功能:
通过使用DTD,可以让每个XML文件自带一个有关其自身格式的描述。
不同公司、组织可一致地使用某个标准的DTD 来交换数据。
应用程序也可使用某个标准的DTD验证所介绍的XML文档是否符合语义约束。
开发者自己也可使用DTD来验证所创建的XML文档。