0

使用 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 和 default 属性是互斥的,但是我的其他可 nillable 但没有默认属性的 dateTime XML 类型可以正常工作。

4

2 回答 2

1

我认为这可能是XML Schema 规范中令人困惑的领域之一(很有趣,即使 1.1 规范也只是禁止默认和固定组合);如果您认为元素的默认值在元素存在且为时适用,并且 nilled 元素不能有任何内容,那么感到困惑是有道理的……它是哪一个:null 或默认值?换句话说,当两个条件都存在时,哪一个优先?我想反序列化器是在那里寻求帮助......

于 2011-12-09T01:06:19.220 回答
1

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

我认为您的架构的正确行为是:如果元素为空且 xsi:nil 不存在或为 false,则使用默认值;如果元素为空且 xsi:nil 为真,则保持原样。

(您可以尝试让 Microsoft 解决此问题,或者您可以尝试切换到 Saxon...)

于 2011-12-09T09:34:30.087 回答