2

首先,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 这样做了:

但不是 JAXB:


最后,——也许我在主观性的悬崖上摇摇欲坠——行为应该是什么?

省略具有默认值的属性可以减少混乱,尤其是在默认值是预期和常见的情况下。例如minOccursmaxOccurs默认1在 XSD 本身中 - 如果您一直在处理 XSD,然后序列化结果,让它们突然出现在每个<element>,<sequence><choice>上会降低可读性。

OTOH,在对象和数据结构中,如果有默认值,我们希望它存在,如果我们查看它。因此,当省略具有默认值的属性时,可能会令人惊讶——如上述 SO 问题所示。

我认为这可能取决于您认为结果是数据还是数据表示。使用表示,可以非常方便地对其进行修改以使其更具可读性。但是对于数据,您希望它完全数据。想法?

4

1 回答 1

2

对于第一个问题,答案是否定的——这不是 XSD 规范所关心的问题。

第二,很难从一个人那里得到答案,仅仅是因为有很多工具包在做这种事情……什么构成“许多”,哪些被认为是相关的,等等。

第三……在我的工作中,我(曾经)经常遇到在 XSD中不使用默认值的建议。争论是默认值通过强制使用 XSD 感知处理器或强制消费者应用程序中的其他逻辑/设置来限制 XML 实例的正确使用。而且,我们不要忘记那些认为默认值是邪恶的人 - 难以发现的错误的来源,例如测试/生产环境中的配置项。

话虽如此,对我而言,序列化默认值的工具很好地表明了采用“防御性编程”风格;它促进了 XML 的互操作性,而与模式语言无关。

所以,我相信任何严肃的 XSD 感知 XML 序列化程序都应该提供一个选项来启用/禁用默认值的序列化。我会将默认设置为 ON(序列化)。

如果您有专门的处理器,这些处理器在设计上必须理解并遵守 XSD 定义的语言,那么实际上线路上的默认值可能会被认为是混乱的(您的最小/最大出现参考);可以选择关闭这些值应该会有所帮助。

于 2012-11-06T15:29:37.243 回答