菜鸟-创作你的创作

深入解析XML中的DTD文档类型定义

下面给你一份系统、清晰、深入浅出、并包含示例的《XML DTD(文档类型定义)深入解析指南》。这是理解 XML 数据结构、验证机制、早期 Web 服务格式的关键内容。


📘 一、什么是 DTD?

DTD(Document Type Definition)文档类型定义用于:

一句话总结:

DTD 是 XML 的“语法规则书”
XML 写的合不合法,DTD 说了算。


📘 二、DTD 的 3 种声明方式


✔ 1. 内部 DTD(写在 XML 文件头部)

<?xml version="1.0"?>
<!DOCTYPE note [
    <!ELEMENT note (to,from,heading,body)>
    <!ELEMENT to (#PCDATA)>
    <!ELEMENT from (#PCDATA)>
    <!ELEMENT heading (#PCDATA)>
    <!ELEMENT body (#PCDATA)>
]>
<note>
    <to>Tom</to>
    <from>Jim</from>
    <heading>Hello</heading>
    <body>Welcome</body>
</note>


✔ 2. 外部 DTD(独立 .dtd 文件)

XML:

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
    ...
</note>

外部 DTD 文件 note.dtd:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
...


✔ 3. 公共(PUBLIC)DTD:用于互联网共享标准

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">


📘 三、DTD 中的核心声明语法


1. ELEMENT 元素定义(最核心)

格式:

<!ELEMENT 元素名 内容模型>

内容模型类型:

类型说明示例
EMPTY空元素,不含内容<br/>
ANY任意内容(不推荐)
#PCDATA文本内容<title>xxx</title>
子元素组合定义嵌套结构(title, body)

✔ 常用符号:

符号说明
,顺序必须固定
``
?可选 0 或 1 次
*0 次或多次
+1 次或多次

例子:

&lt;!ELEMENT Book (Title, Author+, Price?)>

含义:


2. ATTLIST 属性定义

格式:

&lt;!ATTLIST 元素名 属性名 属性类型 默认值>


属性类型包括:

类型说明
CDATA文本字符串
ID唯一标识(全 XML 中唯一)
IDREF引用某个 ID
IDREFS多个 ID
NMTOKEN由字母、数字、连字符组成
ENUMERATION枚举类型

默认值类型:

类型说明
#REQUIRED必须出现
#IMPLIED可选
#FIXED固定值
字面值默认值

例子:

&lt;!ATTLIST Book id ID #REQUIRED>
&lt;!ATTLIST Book category (History|Science|Novel) "Novel">


3. ENTITY 实体定义(类似变量或宏)

内部实体(文本替换)

&lt;!ENTITY writer "阿杰">

使用:

&lt;Author>&amp;writer;&lt;/Author>


外部实体(引用外部文件)

&lt;!ENTITY info SYSTEM "info.txt">


4. NOTATION(表示非 XML 数据格式)

例如图片类型:

&lt;!NOTATION jpeg SYSTEM "image/jpeg">


📘 四、DTD 验证 XML 的原理

流程:

  1. XML 开头声明使用某个 DTD
  2. XML 解析器读取 DTD
  3. 使用 DTD 中的规则匹配 XML 结构
  4. 若标签顺序、数量、结构不正确 → 报错

📘 五、DTD 的典型示例(完整)

XML:

&lt;?xml version="1.0"?>
&lt;!DOCTYPE bookstore SYSTEM "bookstore.dtd">
&lt;bookstore>
    &lt;book id="b1" category="Science">
        &lt;title>宇宙简史&lt;/title>
        &lt;author>Stephen Hawking&lt;/author>
        &lt;price>68&lt;/price>
    &lt;/book>
&lt;/bookstore>

bookstore.dtd:

&lt;!ELEMENT bookstore (book+)>
&lt;!ELEMENT book (title, author+, price)>
&lt;!ATTLIST book 
    id ID #REQUIRED
    category (Science|History|Novel) "Novel">
&lt;!ELEMENT title (#PCDATA)>
&lt;!ELEMENT author (#PCDATA)>
&lt;!ELEMENT price (#PCDATA)>


📘 六、DTD 的优点与缺点

✔ 优点:

✔ 缺点(为什么后期被 XSD 取代):

问题说明
无法定义数据类型例如 int、date、decimal
扩展性差不支持命名空间
无法表达复杂结构例如继承、泛型
基于纯文本校验能力弱

因此现代开发更推荐使用 XSD,但 DTD 是理解 XML 规则体系的基础。


📘 七、实际工程中 DTD 的主要用途

用途说明
配置文件的结构校验(早期 Java 配置)web.xml、struts.xml 老版本
XHTML 网页验证W3C 验证工具
构建 XML 格式说明文档用于简单 XML 格式
SOAP / WebService 旧系统常见于早期接口规范

📘 八、学习 DTD 后应该继续学习什么?

建议顺序:

  1. 理解 DTD(结构规则基础)
  2. 学习 XML Schema XSD(更强大的类型系统)
  3. 使用 XSD + DOM/SAX 做 XML 校验
  4. 了解 XPath 查询 XML
退出移动版