gpt4 book ai didi

c# - Xml Schema 规范是否定义了具有默认值的可选属性的序列化?

转载 作者:太空宇宙 更新时间:2023-11-03 11:13:47 33 4
gpt4 key购买 nike

首先,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默认为 1在 XSD 本身中 - 如果您一直在处理 XSD,然后序列化结果,让它们突然出现在每个 <element> 上, <sequence> , <choice>等使它的可读性降低。

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

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

最佳答案

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

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

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

也就是说,对我来说,序列化默认值的工具是采用“防御性编程”风格的一个很好的指示;它促进了 XML 的互操作性,而与模式语言无关。

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

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

关于c# - Xml Schema 规范是否定义了具有默认值的可选属性的序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13246810/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com