Spring源码学习--DTD和XML Schema介绍

概述

spring在加载xml文件时首先需要知道文件的验证模式类型:DTD和XSD,它们都是xml的约束模式(XSD是XML Schema的文件后缀名),以确保xml的内容的合法性和逻辑正确性.定义一套规则来对xml文档中内容做出限制,则这套定义的规则就是XML文档的约束模式.约束模式定义了XML中出现的元素名,属性,内容类型,以及元素之间的嵌套关系和出现顺序.XML的约束模式有很多,其中应用最广泛和具有代表意义的有: DTD和XML Schema.本文针对该两种模式做个简单的介绍.

DTD

DTD (Document Type Definition,文档类型定义)是早期出现一种XML约束模式语言,也是目前使用最广泛的一种XML约束模式.DTD是一种保证xml文档格式使用是否正确的有效方法,通过比较xml文档和DTD文件来看文档是否符合规范,元素和标签是否正确.

引入外部DTD文件

在xml文件中必须指定约束模式,并引入该约束模式的外部文件或内部定义约束模式规则.XML文档通过使用DOCTYPE声明语句来指定它所所遵循的DTD文件,所以在spring中判断xml文件是否是dtd格式时,直接判断文件中是否存在DOCTYPE声明,如果有则说明是DTD文件.DOCTYPE声明紧跟在xml文档声明语句后面,有两种形式
1.<!DOCTYPE 文档类型名称 SYSTEM “DTD文件的URL”>
2.<!DOCTYPE 文档类型名称 PUBLIC “DTD名称” “DTD文件的URL”>

定义约束

DTD约束模式一般采用以.dtd为后缀的文件定义xml文件中各个元素和它们的相互关系.其中用一下语法结构来定义一个元素:

<!ELEMENT 元素名称 使用规则>

元素使用规则不仅可以定义元素包含的组成成分以及每种组成成分出现的次序,还可以某种组关系组合出现的次数和次序.

1
2
3
4
5
<!ELEMENT 书架 (书+)> 
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>

上面这个例子说明了以下规则:

  1. (书+)中的”+”表示书架中的书元素至少出现一次.
  2. 书元素中可以包含书名,作者,售价元素,且必须按照这个顺序出现.
  3. #PCDATA表示元素中嵌套的内容时普通文本,所以书名,作者,售价元素中嵌套的是文本.

XSD

XSD(XML Schema )是另一种约束模式,其出现的目的时为了客服DTD的局限性.XML Schema已经成为了W3C的正式推荐标准.XML Schema本身就是一个xml文档,它符合xml语法结构.可以通过xml解析器解析它.
在使用Xml Schema文档对Xml文档进行检验时,除了要声明名称空间外(xmlns= ),还必须指定该名称空间所对应的XML Schema文档的存储位置(schemaLocation=)

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.Springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLation="http://www.Springframework.org/schema/beans
http://www.Springframework.org/schema/beans/Spring-beans.xsd">
...
</beans>

两者比较

  1. Xml Schema本身就是xml格式,所以便于理解和学习.
  2. Xml Schema有更多API支持.一些常用的XML API如DOM和SAX,只能处理xml的文档,没有提供解析xml dtd文档内容的功能.
  3. Xml Schema采用了与xml一样的合法性验证机制,而dtd采用另一套机制.
  4. Xml Schema对名称空间支持得非常好,而XML DTD几乎不支持名称空间.
  5. DTD支持的数据类型优先,在大多数环境下显示能力不足.

参考资料

《深入体验java web开发内幕–核心基础》– 张孝祥

0%