当minoccurs = 0时,如何解释XSD中基元类型的默认值

时间:2011-10-27 12:45:40

标签: xml xsd default

在xs:complexType中,有以下元素:                                 

运行像SvcUtil.exe这样的.NET工具,您将获得一个用DataContractAttribute修饰的类,其中包含以下属性:     public string RegistrationNumber {get; set;}     public DateTime ExpiryDate {get; set;}     公共日期时间? RegistrationEndDate {get; set;}

我的困惑是什么: 如果收到的XML实例没有联系这3个元素,则显然会使用默认值,但默认值未在XSD中明确定义。 string和Datetime的默认值是什么?

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

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

2.2.1

总之,元素和属性默认值之间的差异可以表示为:缺少属性时应用默认属性值,当元素为空时应用默认元素值。

那么如果默认值没有明确定义且元素为空/缺席怎么办?

标准似乎没有为这种情况定义,但显然这将受到接收器实现的支配。

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

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

你认为我的理解是正确的吗?

在MSDN中关于DataMemberAttribute.EmitDefaultValue,有一个声明:

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

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

由于

安迪

1 个答案:

答案 0 :(得分:0)

如果XML文档中缺少某个元素,则不应该有任何对象在内存中表示它。可以考虑模式具有minOccurs的任何元素或者定义为列表的maxOccurs。如果它的minOccurs = 0,maxOccurs = 1,那么我们认为它是可选的,但实际上它是一个最多只有一个元素的列表。所以表示它的数据结构应该是一个列表(或带有变量边界或...的数组)。那么它的价值问题毫无意义,规范中也没有含糊之处。

如果SvcUtil.exe没有这样做,我认为没错。