【问题标题】:Does the Xml Schema spec define the serialization of optional attributes with a default?Xml Schema 规范是否使用默认值定义了可选属性的序列化?
【发布时间】: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 这样做了:

但不是 JAXB:


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

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

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

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

【问题讨论】:

    标签: c# jaxb xsd


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 谢谢!是的,上下文很重要。将 XSD/XML 推广到格式/语言,默认值是一种约定(“约定优于配置”)。因此,生成 RoR 项目“格式”的实例不需要了解每个选项。但是要解析该格式,它确实 - 默认值更多信息/复杂性。我想你是在说:格式总是有语法的;如果语法简单,则互操作更容易;如果可以从实例中发现(默认情况下不是),则更容易。 [思考] JSON 通过区分数组和字符串/数字/布尔值在实例中提供更多“模式”信息。
    猜你喜欢
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2018-11-02
    • 2011-03-22
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多