未指定默认值时,缺失的XML枚举属性是否默认取列表首项值
XSD枚举类属性缺失时的默认值行为说明
核心判定结果
你观察到的“缺失枚举属性被自动赋值为枚举列表第一个值”的行为,不符合XML Schema(XSD)官方规范要求,这是C#序列化工具的实现逻辑衍生的特性,并非XML规范的强制规则。
XSD规范的明文规则
- XML属性的缺省值定义,仅承认
<xsd:attribute>声明节点上显式标注的default或fixed属性值。如果属性声明未显式配置这两个值,规范层面不存在任何内置的缺省赋值规则。 - 受限字符串类型下的枚举值列表,本身没有内置的顺序优先级。XSD从未规定“枚举列表的第一个值可作为对应属性的缺省值”,枚举值的书写顺序只是schema文档的排版结果,不具备规范层面的特殊效力。
- 也就是说,当属性既没有显式声明
default值,又在XML实例文档中缺失时,合法的处理结果是“该属性无有效值”,完全可以映射为null,没有任何规范要求处理工具必须为其自动赋值。
C#端出现该行为的原因
这是.NET序列化工具的固有设计逻辑导致,和XSD规范无关:
- XSD定义的枚举类型生成C#代码时,会被映射为原生C#枚举。而C#枚举属于值类型,值类型的默认值永远是底层整数值为0的成员,也就是生成代码时排在枚举列表第一位的枚举值。
- 如果代码生成流程没有针对“XSD中可选、无显式默认值的属性”做可空类型适配,这个值类型枚举就会在属性缺失时自动取到第一个枚举值,无法达到预期的
null映射效果。
问题修正方案
- 若需要让缺失的枚举类属性映射为
null,需在生成C#类型时,将对应枚举属性设置为可空值类型(如YesNoType?),这样反序列化遇到属性缺失时,会正确赋值为null,而非枚举的默认第一个值。 - 若确实需要为属性定义符合XSD规范的缺省值,必须在属性声明节点上显式标注,示例如下:
这种显式声明的缺省值才是XSD规范认可的合法默认值,处理逻辑不受枚举列表书写顺序的影响。<xsd:attribute name="TelMobile" type="core:YesNoType" default="no"/>
内容的提问来源于stack exchange,提问作者Jamie Kitson
相关产品推荐
相关产品推荐

