XSD怎么定义枚举类型 enumeration约束用法

13次阅读

XSD中枚举类型通过约束基类型(如xs:String)并用列举合法值,需注意大小写敏感、不可重复、value为字面量;可复用命名类型或内联定义;数值型枚举虽合法但工具兼容性差,推荐字符串形式。

XSD怎么定义枚举类型 enumeration约束用法

在XSD中定义枚举类型,核心就是用 配合 对简单类型做取值限制。它不是独立类型,而是对已有类型(比如 xs:stringxs:int)的约束,让元素或属性只能取预设的几个值。

怎么写一个基础枚举类型

先定义一个可复用的简单类型,用 包裹,内部通过 指定基类型,再逐个列出允许值:

  • 基类型常用 xs:string,也支持 xs:intxs:decimal 等(但注意:.net 的 Xsd.exe 默认只把字符串型枚举转为 C# enum
  • 每个 就是一个合法选项,value 必须是字面量,不能带表达式或变量
  • value 值区分大小写,且不能重复

示例:定义颜色枚举


  
    
    
    
  

怎么让某个元素使用这个枚举

有两种常用方式,取决于你是否需要复用该类型:

  • 如果已定义好命名类型(如上面的 ColorEnum),直接在元素里用 type 属性引用:
  • 如果只用一次,也可以内联定义(不推荐复用场景):

      
        
          
          
        

      

枚举值能用数字吗?要注意什么

可以,但要小心类型匹配和工具兼容性:

  • 写成 是合法的——它仍是字符串字面量,只是内容是数字字符
  • 写成 + base="xs:int" 也是合法的,此时校验时会按整数比对
  • 但多数代码生成工具(如 .NET 的 xsd.exe)只对 base="xs:string" 的枚举自动生成 C# enum;数值型枚举通常被忽略或转为常量字段
  • 建议:若需跨语言映射,统一用字符串形式定义数字值,语义更清晰,兼容性更好

常见陷阱和验证提示

实际用的时候容易卡在这几处:

  • xml 实例中该元素写了枚举里没有的值(比如写了 “orange” 但枚举只有 red/Green/Blue),解析时会报 SAXParseException 或类似校验失败
  • value 中含空格或特殊字符(如 "New York")没问题,但生成 C# 时可能被自动转成 New_York 或加 [XmlEnum("New York")] 特性
  • 不要在 里嵌套其他元素或属性——它只接受 value 属性
  • 枚举本身不提供默认值,如需默认,得额外加 default="Red" 到元素声明上

基本上就这些。枚举约束本质是“白名单机制”,写清楚、引对地方、校验时自然生效。

text=ZqhQzanResources