是否应该始终默认缺少枚举的 XML 属性?

Posted

技术标签:

【中文标题】是否应该始终默认缺少枚举的 XML 属性?【英文标题】:Should missing enumerated XML attributes always defaulted in? 【发布时间】:2021-06-10 17:05:36 【问题描述】:

如果定义为枚举列表的属性从 XML 元素中丢失,如果列表中的第一个值没有指定默认值,是否应该将其用作默认值?

我在架构中有以下内容:

<xsd:simpleType name="YesNoType">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="yes"/>
        <xsd:enumeration value="no"/>
    </xsd:restriction>
</xsd:simpleType>

<xsd:complexType name="TelephoneStructure">
    <xsd:sequence>
        <xsd:element name="TelNationalNumber" type="core:TelephoneNumberType"/>
        <xsd:element name="TelExtensionNumber" type="core:TelephoneExtensionType" minOccurs="0"/>
        <xsd:element name="TelCountryCode" type="core:TelCountryCodeType" minOccurs="0"/>
    </xsd:sequence>
    <xsd:attribute name="TelUse" type="core:WorkHomeType"/>
    <xsd:attribute name="TelMobile" type="core:YesNoType"/>
    <xsd:attribute name="TelPreferred" type="core:YesNoType"/>
</xsd:complexType>

我已经从上述架构生成了 C# 类型。我预计缺少的属性会导致空值,但我发现缺少的属性默认为列表中的第一个值,根据 XML 规范这是正确的吗?

【问题讨论】:

给定默认值。请参阅:w3schools.com/xml/schema_simple.asp 据我所知,从 XML 到 C# 的映射不受任何 W3C(或其他)标准的约束,这完全是产品设计师的事情, @MichaelKay XML 规范肯定说明了 XML 应该如何解释? 它说默认值应该报告给应用程序,但它没有说明应用程序(这里是你的 C# 绑定库)应该如何处理它们。 【参考方案1】:

根据您的架构,只有 TelExtensionNumberTelCountry code 是可选的。其他所有内容都不是可选的,因此将采用默认值(0 表示 int,null 表示类)。

How to make an element in XML schema optional?

【讨论】:

当我验证 XML 时,验证器不会标记缺失的属性,可选是否只允许空值? 验证 XML 时,是针对架构还是代码进行验证?您可以发布 TelephoneStructure 类、YesNo 枚举和您尝试解析的 XML 吗? 我正在使用 .Net 验证器验证没有针对架构的属性的 XML。 Attributes are by default optional,所以我不确定你的意思是什么。我想你可能错过了我说的是属性而不是元素的事实。

以上是关于是否应该始终默认缺少枚举的 XML 属性?的主要内容,如果未能解决你的问题,请参考以下文章

任何域对象都应该是不可序列化的吗?

有没有办法将默认值设置为缺少/可选的 JSON 属性?

在默认情况下可枚举设置为 false 的 JS 中创建对象属性的其他方法是啥?

属性描述对象

使用 JSON.net(JsonConvert.SerializeObject 或 JsonConvert.DeSerializeObject)为缺少的复杂属性设置默认值

使用 Swift 4 中的 JSONDecoder,缺少的键可以使用默认值而不是可选属性吗?