DTD文件怎么写 DTD验证XML教程

17次阅读

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

DTD文件怎么写 DTD验证XML教程

DTD(Document Type Definition)是定义XML文档结构和约束的最基础方式。它不依赖外部工具或命名空间,适合轻量级、静态结构的XML验证。

DTD文件的基本写法

一个DTD文件可以内嵌在XML中,也可以作为独立文件引用。独立DTD文件以red”>.dtd为扩展名,内容不含XML声明,只包含元素、属性、实体等声明。

  • 声明根元素:用!ELEMENT定义文档必须有的顶层元素,例如:
  • 定义子元素结构:括号内用正则符号描述出现次数和顺序,如book可含titleauthor(至少一个),写成:
  • 声明元素类型:文本内容用#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验证(如javasetValidating(true)pythonxml.etree.ElementTree默认不校验,需用lxmlxmlschema

DTD的局限与替代建议

DTD功能有限,不支持命名空间、数据类型(如日期、整数)、条件约束,且语法非XML格式。现代项目中更推荐:

  • XML Schema(XSD):功能全面,支持命名空间、数据类型、复杂约束,本身是XML格式
  • RELAX NG:语法简洁灵活,有XML和紧凑两种语法,适合人读写
  • Schematron:基于XPath表达式做业务规则校验,适合补充XSD无法覆盖的逻辑

但若只需快速约束简单配置文件(如Ant构建脚本、旧版svg),DTD仍实用、轻量、兼容性好。

text=ZqhQzanResources