在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的,但没有默认属性。

在XML文档中设置nillable=true并使用默认属性是否有效?

错误消息描述了规范中存在的约束:Validation Rule: Element local Valid (Element)子句3.3.2指出,当xsi:nil=true时,必须没有固定值。但是,据我所知,没有禁止默认值,因此似乎您的模式处理器过于急于查找错误。

我认为模式的正确行为是:如果元素为空并且xsi:nil不存在或为false,则使用默认值;如果元素为空且xsi:nil为真,则保持原封不动。

(你可以尝试让微软解决这个问题,或者你可以尝试切换到Saxon…)

我认为这可能是XML Schema规范中那些令人困惑的领域之一(有趣的是,即使是1.1规范也只允许默认和固定的组合);如果您考虑到元素的默认值在元素存在且为空时应用,并且空元素必须不有任何内容,那么感到困惑是有意义的……它是哪个:null还是default?换句话说,当两个条件都存在时,哪一个优先?我猜反序列化器是在寻求帮助。