在XML文档中设置nillable=true并使用默认属性是否有效?
本文关键字:默认 属性 是否 有效 true 文档 XML 设置 nillable | 更新日期: 2023-09-27 18:17:22
使用c#和。net 4.0
我有一个生成的模式,看起来像这样:
<xsd:element name="EstimatedDate" minOccurs="0" nillable="true" default="1900-01-01T00:00:00">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:dateTime">
<xsd:attribute name="origVal" type="xsd:dateTime" use="optional" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
当我用空值序列化对象时,我得到:
<EstimatedDate xsi:nil="true" />
但是我得到了一个反序列化:"当属性为'xsi:nil'并且值为'true'时,必须没有固定值。"
当我查看XML规范时,我没有看到nillable和默认属性是相互排斥的,但是我的其他dateTime XML类型是nillable的,但没有默认属性。
错误消息描述了规范中存在的约束:Validation Rule: Element local Valid (Element)子句3.3.2指出,当xsi:nil=true时,必须没有固定值。但是,据我所知,没有禁止默认值,因此似乎您的模式处理器过于急于查找错误。
我认为模式的正确行为是:如果元素为空并且xsi:nil不存在或为false,则使用默认值;如果元素为空且xsi:nil为真,则保持原封不动。
(你可以尝试让微软解决这个问题,或者你可以尝试切换到Saxon…)
我认为这可能是XML Schema规范中那些令人困惑的领域之一(有趣的是,即使是1.1规范也只允许默认和固定的组合);如果您考虑到元素的默认值在元素存在且为空时应用,并且空元素必须不有任何内容,那么感到困惑是有意义的……它是哪个:null还是default?换句话说,当两个条件都存在时,哪一个优先?我猜反序列化器是在寻求帮助。