【发布时间】:2012-11-06 08:05:00
【问题描述】:
首先,Xml Schema 规范确实指定了optional attribute with a default value 的解析:如果这样的属性在 xml 文档中不存在,那么在使用 XSD 解析时,它们似乎存在,并且具有该默认值。
其次,一些工具将此想法应用于序列化,从而省略具有默认值的属性(换句话说:给定an optional attribute with a default value,当属性具有该值时,它被省略)。
但是,据我所知,这种序列化行为在 Xml 架构中未指定。但这是一个复杂的规范,也许我错过了——规范是否定义了optional attribute with a default value 的序列化?
如果没有,也许它已成为事实上的标准 - 许多工具都实现了这种行为吗?我已经看到 Microsoft 和 MarkLogic 这样做了:
- C#XML Serialization of the default values of optional attributes
- “.net”(一般?)Including xml attribute when the value is the same as the default
- 标记逻辑Default Schema Values in MarkLogic
但不是 JAXB:
- 不是 JAXB JAXB Avoid saving default values
最后,-也许我在这里徘徊在主观性的悬崖上-应该是什么行为?
省略具有默认值的属性可以减少混乱,尤其是在默认值是预期且常见的情况下。例如minOccurs 和 maxOccurs 在 XSD 本身中默认为 1 - 如果您一直在处理 XSD,然后序列化结果,让它们突然出现在每个 <element>、<sequence>、<choice> 等使其可读性降低。
OTOH,在对象和数据结构中,如果有一个默认值,我们希望它存在,如果我们查看它。因此,当省略具有默认值的属性时可能会令人惊讶 - 正如上述 SO 问题所示。
我认为这可能取决于您将结果视为数据还是数据表示。使用表示,可以非常方便地对其进行修改以使其更具可读性。但是对于数据,您希望它完全成为数据。想法?
【问题讨论】: