DTD 实体()最全详解
(5 分钟彻底搞定实体,所有类型一次性讲完)
1. 实体到底是干什么的?
一句话:实体就是 DTD 里的“文本替换宏”,写一次,到处用,像 Word 的自动更正一样。
2. DTD 一共有 5 种实体(记住这 5 种就通杀)
| 种类 | 声明位置 | 使用位置 | 典型用途 | 语法示例 |
|---|---|---|---|---|
| 1. 内部通用实体 | DTD 里 | XML 文档内容里 | 版权、公司名、常用文字 | |
| 2. 外部通用实体 | DTD 里 | XML 文档内容里 | 包含大段文本、章节、公共片段 | |
| 3. 参数实体 | 只能在 DTD 里 | 只能在 DTD 里 | DTD 内部的“宏”,复用代码神器 | |
| 4. 外部非解析实体 | DTD 里 | 配合 NOTATION 用 | 图片、PDF、二进制文件 | |
| 5. 预定义实体 | XML 本身自带 | 任何地方 | 转义 < > & ” ‘ | < > & ” ‘ (不用声明,直接用) |
3. 最常用 3 种实体的完整写法对比(背下来就够用了)
| 类型 | DTD 里怎么声明 | XML 文档里怎么用 | 实际效果 |
|---|---|---|---|
| 内部通用实体 | &company; | → 北京某某科技有限公司 | |
| 外部通用实体 | &chapter1; | → 把整个 chap1.xml 内容插进来 | |
| 参数实体(PE) | %common; (只能在 DTD 里) | → 展开成 id ID #IMPLIED lang CDATA #IMPLIED |
4. 实战案例(直接可抄)
<!-- 1. 内部通用实体(最常用) -->
<!ENTITY company "清华大学出版社">
<!ENTITY copyright "© 2025 &company; 保留一切权利">
<!ENTITY nbsp " "> <!-- 不间断空格 -->
<!-- 2. 外部通用实体(分章节写书超好用) -->
<!ENTITY preface SYSTEM "preface.xml">
<!ENTITY chap1 SYSTEM "chapter1.xml">
<!ENTITY chap2 SYSTEM "chapter2.xml">
<!-- 3. 参数实体(DRY 之王) -->
<!ENTITY % base.attrs "id ID #IMPLIED
class CDATA #IMPLIED
style CDATA #IMPLIED">
<!ATTLIST div %base.attrs;>
<!ATTLIST p %base.attrs;>
<!ATTLIST img %base.attrs;
src CDATA #REQUIRED
alt CDATA #IMPLIED>
<!-- 4. 外部非解析实体(图片) -->
<!NOTATION png SYSTEM "image/png">
<!ENTITY logo SYSTEM "logo.png" NDATA png>
<!ATTLIST cover image ENTITY #IMPLIED>
对应的 XML 使用:
<book>
<title>XML 宝典</title>
<publisher>&company;</publisher>
<copyright>©right;</copyright>
&preface; <!-- 直接把序言文件插进来 -->
&chap1; <!-- 第一章内容直接插进来 -->
<cover image="logo"/> <!-- 声明要用 logo.png 图片 -->
</book>
5. 经典口诀(30 秒记住区别)
- 普通实体用 &xxx; → 用在 XML 正文里
- 参数实体用 %xxx; → 只用在 DTD 里
- 想复用属性 → 参数实体
- 想复用大段文字 → 外部通用实体
- 想写 © ™ ® < > → 内部通用实体或预定义实体
6. 常见错误(别踩坑)
| 错误写法 | 正确写法 | 原因 |
|---|---|---|
| 在 XML 正文里写 %company; | 只能写 &company; | % 只在 DTD 里有效 |
| 然后在正文 © | 参数实体不能被 &xxx; 引用 | 参数实体只能在 DTD 内部展开 |
| 外部实体写 PUBLIC 却没网址 | SYSTEM 更简单 | 新手建议先用 SYSTEM |
现在你已经完全掌握 DTD 实体了!
想直接拿一个「出版级图书 DTD 完整实体模板」(带章节分离 + 版权 + 公共属性),回复“给我图书模板”就行!