我收到了来自基于Java系统生成的第三方供应商的XSD;这将用于为我们创建SOAP端点以接收数据传输。他们的XSD不使用W3C / XSD名称空间中定义的nillable属性,例如:
<xs:complexType name="Customer">
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="1" name="ID" type="xs:integer"/>
<xs:element minOccurs="0" maxOccurs="1" name="TitleID" type="xs:integer"/>
<xs:element minOccurs="0" maxOccurs="1" name="FirstName" type="xs:string"/>
<xs:element minOccurs="0" maxOccurs="1" name="FamilyName" type="xs:string"/>
<xs:element minOccurs="0" maxOccurs="1" name="PreviousName" type="xs:string"/>
<xs:element minOccurs="0" maxOccurs="1" name="DateOfBirth" type="xs:date"/>
</xs:sequence>
</xs:complexType>
当与供应商交谈时,提到了#34;其中minOccurs =&#34; 0&#34;并且它们没有价值,元素将被省略&#34;。
当我们使用XSD架构定义工具创建类时;正确生成类有两个例外:DateOfBirth和TitleID属性不可为空。
除非nillable =&#34; true&#34;尽管minOccurs =&#34; 0&#34;在XSD中声明了简单类型,值类型或者没有创建为Nullable组态。经过一些研究后,我觉得这种解释在以下文章中给出的信息是正确的:
我从上面得出结论,minOccurs =&#34; 0&#34;是一个定义,指出 XML 中的元素是可选的,但没有任何特定含义。很明显,在SOAP消息中;没有为特定元素传达任何价值nill =&#34; true&#34;应该在空元素中使用。
向我们的供应商提交时;我认为缺少的nillable属性会使XSD模糊不清,并且在引用标准时缺乏意图,因为省略了元素并不表示null,这只是暗示。 W3C声明如果消息需要指示元素为空,则应明确说明。他们的代表不同意并认为如果没有DateOfBirth(例如),他们将在SOAP消息中删除此元素。他们认为这是可以接受的并且符合标准。根据我的阅读here,minOccurs / nillable在Java中具有相同的行为(可能为什么他们觉得他们不必使用nillable属性)
我知道我最终可以解决这个问题;它(可能)为了我们的供应商不希望在XSD和SOAP消息中使用nill / nillable属性而需要额外增加的代码量。我正在WCF中构建SOAP API;在反序列化时,我将检查生成的所有Specified属性以检查缺少的元素。这是因为将在xml消息中未引用的值类型将分配其默认值。或者,我可以通过XSD并自己添加它们,我觉得这是一个坏主意。我将改变他们的定义,任何新版本都需要相同的努力,目前每3-6个月一次。
我的问题是: