首先,Xml Schema 规范确实指定了解析:optional attribute with a default value
如果这样的属性在 xml 文档中不存在,那么当使用 XSD 解析时,它们似乎存在,并且具有该默认值。
其次,一些工具将这个想法应用于序列化,因此具有默认值的属性被省略(换句话说:给定an optional attribute with a default value
,当属性具有该值时,它被省略)。
但是,据我所知,这种序列化行为并未在 Xml Schema 中指定。但这是一个复杂的规范,也许我错过了 - 规范是否定义了序列化optional attribute with a default value
?
如果不是,也许它已经成为事实上的标准——许多工具是否实现了这种行为?我已经看到 Microsoft 和 MarkLogic 这样做了:
- C# XML 序列化可选属性的默认值
- “.net”(一般?)当值与默认值相同时包括xml属性
- MarkLogic中的默认模式值
但不是 JAXB:
- not JAXB JAXB 避免保存默认值
最后,——也许我在主观性的悬崖上摇摇欲坠——行为应该是什么?
省略具有默认值的属性可以减少混乱,尤其是在默认值是预期和常见的情况下。例如minOccurs
并maxOccurs
默认1
在 XSD 本身中 - 如果您一直在处理 XSD,然后序列化结果,让它们突然出现在每个<element>
,<sequence>
等<choice>
上会降低可读性。
OTOH,在对象和数据结构中,如果有默认值,我们希望它存在,如果我们查看它。因此,当省略具有默认值的属性时,可能会令人惊讶——如上述 SO 问题所示。
我认为这可能取决于您认为结果是数据还是数据表示。使用表示,可以非常方便地对其进行修改以使其更具可读性。但是对于数据,您希望它完全是数据。想法?