在XML Schema定义中,final和fixed是两个常用于约束结构与数据的属性。final主要作用在元素声明和复杂类型、简单类型上,用来阻止派生或替换;fixed则用在元素或属性声明上,强制其值固定不可被实例文档覆盖。掌握它们的区别和写法,可以让我们设计的Schema更严谨。

final属性的用法
final可以出现在element、complexType和simpleType上。对于element,final取值可以是extension、restriction、substitution或全部列表;对于类型,final控制是否允许被扩展或限制派生。
在元素上阻止替换
下面的例子中,声明了名为user的元素,并设置final="substitution",表示其他元素不能通过substitution方式替换它。
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="user" type="xs:string" final="substitution"/> <!-- 下面这种替换声明将被视为非法 --> <!-- xs:element name="admin" substitutionGroup="user" / --> </xs:schema>
在类型上阻止派生
在complexType上使用final="extension restriction"可阻止基于该类型做扩展或限制。
<xs:complexType name="baseType" final="extension restriction">
<xs:sequence>
<xs:element name="id" type="xs:int"/>
</xs:sequence>
</xs:complexType>
fixed属性的用法
fixed用在element或attribute声明中,表示实例文档里该值必须和Schema中指定的值一致,不能被更改。它和default不同,default只是缺省值且允许覆盖。
固定元素值
如下声明要求status元素的值只能是active,写其他值会校验失败。
<xs:element name="status" type="xs:string" fixed="active"/>
固定属性值
属性同样可以使用fixed锁定取值。
<xs:attribute name="version" type="xs:string" fixed="1.0"/>
二者对比
可以用一个表格快速区分它们的控制目标:
| 属性 | 作用对象 | 控制内容 |
|---|---|---|
| final | element、complexType、simpleType | 阻止派生、扩展或替换 |
| fixed | element、attribute | 锁定实例中的具体值 |
使用建议
当你不希望别人基于你的Schema类型随便扩展,或者不允许某些关键元素被替换时,用final。当你需要配置文件里某些字段必须保持特定值,例如协议版本、状态标识,就用fixed。合理搭配能让XML数据交换更可靠。
XML_Schemafinalfixed修改时间:2026-07-26 12:42:19