DTD中参数实体与普通实体本质不同:参数实体(%name;)仅用于DTD内部定义和引用,解决DTD结构复用;普通实体(&name;)用于XML正文内容替换,解决内容复用,且类型更丰富。

DTD里的参数实体和普通实体,根本不是一回事——它们的“地盘”、写法、用法全都不一样。
使用位置完全不同
普通实体是给XML文档正文用的,比如在©这种地方替换一段文字;参数实体只在DTD内部起作用,XML正文里根本不能出现%xxx;这种写法。
- 普通实体:定义在DTD中,引用在XML内容里(如
&address;) - 参数实体:定义在DTD中,也只允许在DTD里引用(如
%address;),连DOCTYPE内部子集里都不能跨到XML正文去用
定义和引用的语法一眼可辨
看符号就能分清:普通实体没百分号,参数实体一定带%。
- 普通实体定义:
,引用:&address; - 参数实体定义:
,引用:%address;
设计目的也不一样
普通实体解决的是“内容复用”问题,比如把重复地址、版权信息抽出来;参数实体解决的是“DTD结构复用”问题,常用来批量控制元素声明、条件编译(比如配合或做模块开关)。
- 普通实体让XML内容更简洁、易维护
- 参数实体让DTD本身更灵活、可配置,尤其适合大型或可定制的DTD设计
类型限制也有差别
参数实体只能是已解析实体(也就是纯文本内容),不能指向外部二进制文件或未解析资源;普通实体则分得更细,有内部/外部、已解析/未解析之分,比如就是未解析的外部普通实体。
基本上就这些。







