xsd中枚举类型通过xs:restriction嵌套xs:enumeration定义,需基于简单类型限制值域;支持内联定义或命名复用,可应用于字符串、整数等类型,但值必须唯一且为字面量。

在XSD中创建枚举类型,就是用 <restriction></restriction> 套住 <enumeration></enumeration>,把允许的值一个个列出来。核心是定义一个简单类型(simpleType),再在里面限制取值范围。
基础写法:内联定义枚举
直接在元素声明里定义枚举类型,适合只用一次的场景:
<element name="status"><simpletype><restriction base="xs:string"><enumeration value="draft"></enumeration><enumeration value="pending"></enumeration><enumeration value="approved"></enumeration><enumeration value="rejected"></enumeration></restriction></simpletype></element>
这样,<status></status> 元素的内容只能是这四个字符串之一,大小写敏感,空白也不允许(除非显式加上 xs:whiteSpace value="collapse")。
复用写法:命名简单类型 + 枚举
如果多个地方要用同一组取值,建议单独定义命名类型,便于维护和复用:
<simpletype name="OrderStatus"><restriction base="xs:string"><enumeration value="new"></enumeration><enumeration value="shipped"></enumeration><enumeration value="delivered"></enumeration><enumeration value="cancelled"></enumeration></restriction></simpletype><element name="orderStatus" type="OrderStatus"></element>
注意:类型名首字母大写是常见约定,有助于区分内置类型。
支持数字或布尔枚举
枚举不限于字符串。比如限制为整数:
<simpletype name="PriorityLevel"><restriction base="xs:integer"><enumeration value="1"></enumeration><enumeration value="2"></enumeration><enumeration value="3"></enumeration></restriction></simpletype>
布尔值也可以枚举,但通常不必要(因为 xs:boolean 本身只接受 true/false);若需语义化,可用字符串枚举如 "yes"/"no" 或 "on"/"off"。
小贴士:避免常见坑
- 每个
<enumeration></enumeration>的value属性必须是字面量,不能是表达式或变量 - 重复的
value会导致验证失败(XSD处理器会报错) - 如果想让空字符串也合法,需额外加一条
<enumeration value=""></enumeration> - 中文、特殊符号、带空格的值都可以,但要确保 XML 实例中完全一致(包括空格和大小写)
基本上就这些。枚举本质是值域约束,写清楚、保持唯一、注意类型匹配,就能稳稳生效。











