Xml Schema规范是否使用默认值定义可选属性的序列化?

时间:2012-11-06 08:05:00

标签: c# jaxb xsd

首先,Xml架构规范 指定optional attribute with a default value解析:如果xml文档中不存在这样的属性,那么在解析时XSD,它们似乎存在,并具有该默认值。

其次,有些工具将此想法应用于序列化,因此省略了具有默认值的属性(换句话说:给定an optional attribute with a default value,当属性具有该值时,省略它)。

但是,据我所知,此序列化行为在Xml架构中未指定。但这是一个复杂的规范,也许我错过了 - 规范是否定义了optional attribute with a default value的序列化?


如果没有,也许它已成为事实上的标准 - 许多工具是否实现了这种行为?我已经看到微软和MarkLogic这样做了:

但不是JAXB:


最后, - 也许在这里我徘徊在主观性的悬崖上 - 应该是什么行为?

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

第三...在我的工作中,我(过去常常)在XSD中使用默认值 NOT 推荐。争论的焦点是,默认值通过强制使用支持XSD的处理器或强制使用消费者应用程序中的其他逻辑/设置来限制XML实例的正确使用。而且,我们不要忘记那些认为违约是邪恶的人 - 难以发现的错误的来源,例如:测试/生产环境中的配置项。

话虽如此,对我来说,一个序列化默认值的工具是采用“防御性编程”风格的一个很好的迹象;它提升了XML的互操作性,而不管模式语言如何。

因此,我认为任何严重的XSD感知XML序列化程序应该提供启用/禁用默认值序列化的选项。我将默认值设置为ON(序列化)。

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