DTD —— XML 的“构建模块”全解析
(让你真正明白 DTD 到底由哪几块积木拼成)
DTD 就像乐高积木的说明书,它一共只有 5 大核心构建模块,掌握这 5 块就能拼出任何复杂度的 XML 结构。
| 模块序号 | 模块名称 | 作用(用大白话) | 关键字/语法 | 必备度 |
|---|---|---|---|---|
| 1 | 元素声明 | 规定“可以出现哪些标签”以及“标签里能放什么” | ★★★★★ | |
| 2 | 属性声明 | 给标签添加“附加属性”(就像给人加身份证、性别) | ★★★★☆ | |
| 3 | 实体声明 | 定义“快捷替换文字”(© → ©) | ★★★☆☆ | |
| 4 | 参数实体(PE) | 只在 DTD 内部使用的“宏”,用来复用代码 | %name; | ★★★☆☆ |
| 5 | 记法声明 | 告诉解析器如何处理非 XML 数据(图片、PDF 等) | ★☆☆☆☆(很少用) |
下面每块都配最常用、最实用的例子。
1. 元素声明()——最重要的模块
<!ELEMENT 标签名 内容模型>
常见内容模型一览表(记住这 8 种就够用 95% 的场景):
| 内容模型 | 含义 | 示例写法 |
|---|---|---|
| (#PCDATA) | 只能放纯文字 | |
| EMPTY | 空标签( 这种) | |
| ANY | 随便放什么(不推荐) | |
| (子元素列表) | 必须按顺序出现 | |
| , | 顺序固定 | (title,author,price) |
| 或者关系 | ||
| ? | 0 或 1 次 | email? |
| * | 0 次或多次 | phone* |
| + | 1 次或多次 | author+ |
| () | 分组 | (address,(phone |
实战例子:
<!ELEMENT 图书馆 (图书+)>
<!ELEMENT 图书 (书名, 作者+, 价格, 标签*)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 价格 (#PCDATA)>
<!ELEMENT 标签 (#PCDATA)>
2. 属性声明()——给标签加“属性栏”
<!ATTLIST 图书
id ID #REQUIRED <!-- 必须有且唯一 -->
分类 CDATA "计算机" <!-- 默认值 -->
版次 NMTOKEN #IMPLIED <!-- 可选 -->
语言 (中文|英文|日文) "中文"
精装 (yes|no) #FIXED "yes"> <!-- 固定值 -->
3. 实体声明()——快捷键
<!ENTITY company "北京某某科技有限公司">
<!ENTITY copy "© 2025 本公司所有">
<!ENTITY logo SYSTEM "logo.png"> <!-- 外部图片实体 -->
使用时:
<版权信息>&company; ©</版权信息>
4. 参数实体(% xxx;)—— DTD 自己的“宏”,超级好用
<!-- 先定义公共属性宏 -->
<!ENTITY % common.attrs "id ID #IMPLIED
class CDATA #IMPLIED
style CDATA #IMPLIED">
<!-- 所有标签都可以直接复用 -->
<!ATTLIST div %common.attrs;>
<!ATTLIST p %common.attrs;>
<!ATTLIST table %common.attrs;>
5. 记法声明()——基本可以忽略
用来声明二进制文件格式(现在几乎没人用):
<!NOTATION png SYSTEM "image/png">
<!NOTATION pdf SYSTEM "application/pdf">
完整小案例(5 大模块全用上)
文件:library.dtd
<!ENTITY % attrs "id ID #REQUIRED category CDATA #IMPLIED">
<!ELEMENT 图书馆 (图书+)>
<!ELEMENT 图书 (书名, 作者+, 价格, 简介?)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 价格 (#PCDATA)>
<!ELEMENT 简介 (#PCDATA)>
<!ATTLIST 图书 %attrs;>
<!ENTITY publisher "清华大学出版社">
对应的 XML:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 图书馆 SYSTEM "library.dtd">
<图书馆>
<图书 id="001" category="计算机">
<书名>XML 从入门到精通</书名>
<作者>张三</作者>
<作者>李四</作者>
<价格>89</价格>
</图书>
</图书馆>
一句话总结:
DTD 只有这 5 块积木:
元素 + 属性 + 实体 + 参数实体 +(记法)
把这 5 块玩熟了,你就能随心所欲地给任何 XML 搭骨架!
需要我再给你一个“30 行 DTD 搞定博客系统”完整模板吗?直接说“来一个博客模板”就行!