DTD是定义XML文档结构和约束的基础方式,支持内嵌或外部引用,通过ELEMENT、ATTLIST等声明元素与属性,但不支持命名空间和数据类型,现代项目多用XSD等替代。

DTD(Document Type Definition)是定义XML文档结构和约束的最基础方式。它不依赖外部工具或命名空间,适合轻量级、静态结构的XML验证。
DTD文件的基本写法
一个DTD文件可以内嵌在XML中,也可以作为独立文件引用。独立DTD文件以red">.dtd为扩展名,内容不含XML声明,只包含元素、属性、实体等声明。
-
声明根元素:用
!ELEMENT定义文档必须有的顶层元素,例如: -
定义子元素结构:括号内用正则符号描述出现次数和顺序,如
book可含title、author(至少一个),写成: -
声明元素类型:文本内容用
#PCDATA,混合内容加括号,例如:或 -
定义属性:用
!ATTLIST,指定所属元素、属性名、类型、默认值,例如:(id为必需的唯一标识)
在XML中引用DTD进行验证
XML文档需通过DOCTYPE声明关联DTD,才能触发解析器的DTD验证。引用方式分两种:
-
内部DTD:DOCTYPE后直接写声明,适用于简单场景:
]> -
外部DTD:引用本地或远程DTD文件,推荐用于复用:
或公共DTD:
注意:SYSTEM后路径为相对路径(相对于XML文件位置),系统不自动联网下载;PUBLIC需配合公共标识符与系统标识符使用。
常见验证失败原因与检查点
即使语法正确,DTD验证也常因细节疏忽报错。重点核对以下几项:
- XML中使用的元素名、属性名是否全部在DTD中声明过
- 元素嵌套是否符合DTD定义的顺序和数量(如
author+表示至少一个,不能为零个) - 属性值是否满足类型约束(如
ID值不能重复、不能含空格;ENUMERATED只能取限定值) - 实体是否正确定义并正确引用(如
,引用时写©) - 解析器是否启用DTD验证(如Java中
setValidating(true),Python的xml.etree.ElementTree默认不校验,需用lxml或xmlschema)
DTD的局限与替代建议
DTD功能有限,不支持命名空间、数据类型(如日期、整数)、条件约束,且语法非XML格式。现代项目中更推荐:
- XML Schema(XSD):功能全面,支持命名空间、数据类型、复杂约束,本身是XML格式
- RELAX NG:语法简洁灵活,有XML和紧凑两种语法,适合人读写
- Schematron:基于XPath表达式做业务规则校验,适合补充XSD无法覆盖的逻辑
但若只需快速约束简单配置文件(如Ant构建脚本、旧版SVG),DTD仍实用、轻量、兼容性好。










