当 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 生成的类中显示