当 minoccurs=0 时如何解释 XSD 中原始类型的默认值

Posted

技术标签:

【中文标题】当 minoccurs=0 时如何解释 XSD 中原始类型的默认值【英文标题】:How to interpret default values of primitive types in XSD when minoccurs=0 【发布时间】:2011-10-27 12:45:39 【问题描述】:

在 xs:complexType 内部,有以下元素:

运行 SvcUtil.exe 等 .NET 工具,您将获得一个装饰有 DataContractAttribute 的类,其中包含以下属性: 公共字符串 RegistrationNumber get;set; 公共日期时间 ExpiryDate get;set; 公共日期时间? RegistrationEndDate get;set;

让我困惑的是: 如果接收到的 XML 实例不联系这 3 个元素,则显然将使用默认值,尽管默认值未在 XSD 中明确定义。字符串和日期时间的默认值是什么?

为了刷新我的记忆,我看看

http://www.w3.org/TR/xmlschema-0/

2.2.1

总而言之,元素默认值和属性默认值的区别可以表述为:属性缺失时应用默认属性值,元素为空时应用元素默认值。

如果没有明确定义默认值并且元素为空/不存在怎么办?

标准似乎没有为这种情况定义,但显然这将取决于接收器的实现。

对于像整数和布尔这样的数据类型,默认值很明显:0 和 false。从电子计算的第一天开始就定义明确。

但是对于字符串和日期时间,情况就有点棘手了,主要是因为不同的语言对字符串和日期时间有不同的结构和约定。

你认为我的理解正确吗?

在MSDN中关于DataMemberAttribute.EmitDefaultValue,有这么一句话:

“不建议将 EmitDefaultValue 属性设置为 false。只有在有特定需要时才应该这样做(例如为了互操作性或减少数据大小)。”

你能告诉我为什么这不是推荐的做法吗?比如说,无论在 XML 消息中是否 minOccurs=0,听起来 MS 都建议发射每个元素?

谢谢

安迪

【问题讨论】:

【参考方案1】:

如果 XML 文档中没有元素,那么内存中不应该有任何对象来表示它。将架构具有 minOccurs 或 maxOccurs 的任何元素视为定义的列表。如果它的 minOccurs=0, maxOccurs=1 那么我们认为它是可选的,但实际上它是一个最多包含一个元素的列表。所以表示它的数据结构应该是一个列表(或具有可变边界的数组或......)。那么它的价值问题就没有意义了,规范中也没有歧义。

如果 SvcUtil.exe 不这样做,我认为是不对的。

【讨论】:

以上是关于当 minoccurs=0 时如何解释 XSD 中原始类型的默认值的主要内容,如果未能解决你的问题,请参考以下文章

JAXB xs:maxLength 和 minOccurs="0" 未在 xsd 生成的类中显示

在XSD中,当可选的父元素出现时,它的子元素是必需的吗?

对于SimpleTypes,如何摆脱'minOccurs'属性不允许的错误?

WSDL合同列表与数字一起出现

如何在XSD中查找类型声明?

如何在 XSD 中添加条件验证: