DTD用于定义XML文档结构,分内部(嵌入XML内、需方括号)、外部(独立.dtd文件,用SYSTEM/PUBLIC引用)及混合声明三种形式,内部优先;现代多用XSD替代。

XML文档中,DTD(Document Type Definition)用于定义文档的结构和合法元素。内部DTD直接写在XML文件内,外部DTD则存为独立文件,通过引用方式加载。
内部DTD的声明方式
内部DTD写在XML声明之后、根元素之前,用标签包裹,语法格式如下:
- DTD定义内容 ]>
- DTD定义内容可以包含元素声明()、属性声明()、实体声明()等
- 注意:方括号[ ]必须存在,即使内部为空(但通常不为空)
示例:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <note> <to>Alice</to> <from>Bob</from> <heading>Reminder</heading> <body>Don't forget the meeting.</body> </note>
外部DTD的声明方式
外部DTD保存为单独的.dtd文件,XML文档通过SYSTEM或PUBLIC关键字引用它。
- SYSTEM:指向本地或相对路径的DTD文件,适用于私有或项目内DTD
- PUBLIC:配合公共标识符使用,常用于标准DTD(如HTML、MathML),解析器可能从目录或网络获取
- 声明位置同样在XML声明之后、根元素之前
SYSTEM引用示例(假设note.dtd与XML同目录):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE note SYSTEM "note.dtd"> <note> <to>Alice</to> <from>Bob</from> <heading>Reminder</heading> <body>Don't forget the meeting.</body> </note>
混合声明:内部+外部DTD
可以同时使用内部和外部DTD,内部部分会覆盖或补充外部定义(遵循“内部优先”原则)。
- 语法: SYSTEM "..." [ 内部声明 ]>
- 常用于在标准DTD基础上添加自定义实体或重定义个别元素
- 例如:引用W3C的XHTML DTD,再在内部声明一个自定义实体
示例:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" [ <!ENTITY copyright "© 2024 My Company"> ]> <html xmlns="http://www.w3.org/1999/xhtml"> <body>©right;</body> </html>
注意事项
实际使用中需注意以下几点:
- XML解析器默认可能不自动加载外部DTD(尤其在安全策略下),部分解析器需显式启用validation或设置setFeature("http://apache.org/xml/features/validation/dtd", true)
- 内部DTD不能省略方括号;外部DTD的路径区分大小写,且需确保文件可访问
- 现代开发中,DTD已逐渐被XML Schema(XSD)替代,因其支持数据类型、命名空间等更强大功能
- 如果既没内部也没外部DTD,DOCTYPE仍可存在(如<!DOCTYPE note>),但仅作文档类型提示,无约束力










