DTD的参数实体和普通实体有什么区别

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设计

类型限制也有差别

参数实体只能是已解析实体(也就是纯文本内容),不能指向外部二进制文件或未解析资源;普通实体则分得更细,有内部/外部、已解析/未解析之分,比如就是未解析的外部普通实体。

基本上就这些。