使用SYSTEM或PUBLIC关键字在DOCTYPE声明中引用外部DTD,位置需紧接XML声明后;2. SYSTEM用于本地或相对路径,如;3. PUBLIC用于公共DTD,需提供公共标识符和系统URI,如HTML 4.01的声明;4. 路径可为相对或绝对URL,但部分解析器限制远程加载;5. DTD编码不同时应在其内声明encoding;6. 仅验证型解析器会应用DTD;7. 可同时引用内部和外部DTD,内部子集定义优先。

在XML文档中引用外部DTD文件,需在文档声明部分使用DOCTYPE声明,并通过SYSTEM或PUBLIC关键字指定DTD位置。最常用的是SYSTEM方式,适用于本地或相对路径的DTD文件。
基本语法格式(SYSTEM方式)
这是最常见、最直接的引用方式,适用于自定义或项目内维护的DTD文件:
em>根元素名 SYSTEM "DTD文件路径">
例如:
表示当前XML文档的根元素是book,其约束规则定义在同目录下的book.dtd文件中。
使用PUBLIC方式引用公共DTD
当引用标准或公开注册的DTD(如HTML 4.01、MathML等)时,用PUBLIC标识符配合公共ID和系统ID:
a style="color:#f60; text-decoration:underline;" title= "html"href="https://www.php.cn/zt/15763.html" target="_blank">html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
其中:
- "-//W3C//DTD HTML 4.01//EN" 是公共标识符(FPI),用于唯一标识该DTD;
- "http://www.w3.org/TR/html4/strict.dtd" 是系统标识符(URI),指向实际文件位置。
注意事项与常见问题
引用外部DTD时需注意以下几点,否则解析器可能报错或忽略校验:
- DOCTYPE声明必须紧接在XML声明之后(即
之后),且只能有一个 - DTD文件路径支持相对路径(如
"dtds/config.dtd")或绝对URL(如"https://example.com/my.dtd"),但部分解析器默认不加载远程DTD(出于安全考虑) - 若DTD文件编码与XML不同(如DTD为ISO-8859-1而XML为UTF-8),应在DTD文件首行显式声明编码:
(注意:这不是XML声明,而是DTD内的处理指令,仅部分解析器支持) - 验证型解析器(如Java中的
DocumentBuilder设为setValidating(true))才会实际读取并应用外部DTD;非验证解析器会跳过它
能否同时引用内部和外部DTD?
可以。XML允许在DOCTYPE中先写内部子集,再引用外部DTD,语法如下:
]>
内部子集(方括号内)会与外部DTD合并生效,且内部定义优先级更高(例如可覆盖外部DTD中同名元素声明)。
基本上就这些。关键是确保DOCTYPE位置正确、路径可访问、解析器启用验证——不复杂但容易忽略细节。









