XML本身无继承机制,其“继承性”是通过DTD或XSD在约束层面模拟的复用效果:DTD用参数实体实现文本级结构复用,XSD则通过extension/restriction支持类型级派生与模块化建模。

XML本身没有继承机制,所谓“继承性”其实是通过DTD或XSD这类模式定义语言,在约束层面模拟出类似面向对象中“继承”的复用效果——不是XML语法自带的特性,而是靠模式文档的设计技巧实现的。
DTD中的元素复用:参数实体 + 元素声明组合
DTD不支持真正的继承,但可以用参数实体(parameter entities)把公共内容抽出来,再在不同元素声明中引用,达到结构复用的效果。
- 用red">%commonAttrs;定义一组通用属性,比如
- 在多个元素声明中重复使用: 和
- 也能用参数实体包裹内容模型,例如%nameGroup;封装(firstName, lastName?),供person、author等元素共用
这种方式本质是文本替换,灵活但缺乏类型约束和层级抽象能力。
XSD中的“继承式”复用:extension与restriction
XSD通过xs:extension和xs:restriction显式支持类型派生,更接近传统继承语义。
- xs:extension:子类型在父类型基础上添加新元素或属性。例如addressType扩展locationType,加入postalCode
- xs:restriction:子类型对父类型的取值范围、长度等做收紧限制。比如emailType限制为string且匹配邮箱正则
- 元素本身可通过type属性引用复用类型,也可用xs:group或xs:attributeGroup抽取公共片段,被多个复杂类型引用
这种机制有明确的类型系统支撑,支持工具生成类、验证时做类型推导,复用粒度更细、语义更清晰。
关键区别:复用目标与能力边界
DTD侧重于语法结构的文本级复用,XSD则提供类型级的可扩展建模能力。
- DTD无法表达“这个元素是那个类型的特化”,只能靠命名和人工约定暗示关系
- XSD能声明substitutionGroup,允许一个元素替代另一个(如book替代publication),形成松耦合的替换继承链
- XSD还支持xs:redefine(已不推荐)或xs:include/xs:import跨文档复用,模块化程度更高
基本上就这些。XML没继承,但DTD靠“抄模板”,XSD靠“定义类型谱系”,目的都是少写重复约束,让结构更易维护。










