在XML文档开发中,DTD(文档类型定义)用于约束XML文档的元素、属性等结构,外部DTD可以将约束规则单独存放在独立文件中,方便多个XML文档复用。XML文档引用外部DTD主要有两种语法格式,分别对应私有外部DTD和公共外部DTD的引用场景。

外部DTD的基本概念
外部DTD是指将DTD规则写在独立的.dtd文件中,而不是嵌入在XML文档内部。使用外部DTD可以减少XML文档的冗余代码,同时让约束规则可以被多个XML文档共享,提升开发效率。
私有外部DTD的引用语法
私有外部DTD通常是开发者自己定义的、未公开给公共使用的DTD文件,引用语法格式如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE 根元素名称 SYSTEM "外部DTD文件的URI路径">
其中各部分的含义如下:
<!DOCTYPE:文档类型声明的固定开头- 根元素名称:XML文档中最顶层的根元素名称,需要和DTD中定义的根元素一致
SYSTEM:表示引用的是私有外部DTD的关键字- 外部DTD文件的URI路径:可以是本地文件路径,也可以是网络上的DTD文件地址,如果是本地文件,相对路径和绝对路径都支持
下面是一个实际的私有外部DTD引用示例,首先定义外部DTD文件user.dtd:
<!-- user.dtd 文件内容 --> <!ELEMENT user (name, age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)>
然后XML文档引用该DTD:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE user SYSTEM "user.dtd">
<user>
<name>张三</name>
<age>25</age>
</user>
公共外部DTD的引用语法
公共外部DTD是已经公开给行业或公共使用的DTD,比如一些标准组织发布的通用DTD,引用语法格式如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE 根元素名称 PUBLIC "公共DTD的标识符" "外部DTD文件的URI路径">
其中新增的PUBLIC关键字表示引用的是公共外部DTD,公共DTD的标识符是一个唯一的字符串,用于标识该公共DTD,通常遵循一定的命名规范,比如以-//组织名称//DTD名称//语言的格式命名。
以引用公共的XHTML 1.0 Strict 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">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>示例页面</title>
</head>
<body>
<p>这是一个XHTML示例</p>
</body>
</html>
引用外部DTD的注意事项
- XML文档的文档类型声明必须放在
<?xml?>声明之后,根元素之前,位置错误会导致XML解析失败 - 外部DTD文件的路径必须正确,否则解析器无法加载DTD规则,会抛出找不到DTD的错误
- 如果同时有内部DTD和外部DTD,内部DTD的定义会覆盖外部DTD中同名的规则
- 部分XML解析器默认可能关闭DTD验证功能,需要手动开启验证才能检查XML文档是否符合外部DTD的约束
两种引用方式的对比
下面是私有外部DTD和公共外部DTD引用方式的对比:
| 对比项 | 私有外部DTD引用 | 公共外部DTD引用 |
|---|---|---|
| 关键字 | SYSTEM | PUBLIC |
| 参数数量 | 2个(根元素、DTD路径) | 3个(根元素、公共标识符、DTD路径) |
| 适用场景 | 自定义、未公开的DTD | 公开的标准化DTD |
| 标识符要求 | 无特殊要求 | 需要符合公共DTD的命名规范 |
掌握XML外部DTD的引用语法,能够帮助开发者更规范地编写XML文档,同时提升约束规则的复用性,在实际开发中可以根据DTD的归属选择合适的引用方式。