我有一个应用程序将相同的XML文档发送到许多系统。现在其中一个系统想要额外获得一个字段。 问题是如何将字段添加到文档并将其发送到所有系统而不会破坏其过程。在另一个工作中,如何让其他系统忽略添加的字段?
答案 0 :(得分:1)
如果没有破坏现有收件人,则无法执行此操作,除非收件人的设计考虑到此类更改。
XML系统通常会指定“如果您不理解某个元素,然后忽略它”的策略,如果您有这样的策略,并且人们都遵循它,那么添加新的可选字段变得很容易。但是,如果没有这样的政策,或者如果它没有经过严格的测试,那么添加字段就有可能破坏。
在架构级别,可以将新字段添加为可选元素或属性。如果扩展是针对特定客户端或客户端组的自定义,那么您可能需要考虑将额外的元素或属性放入不同的命名空间中,以便它们不会与其他人发明的扩展冲突。这还允许您利用XSD架构通配符,使任何内容有效,前提是它位于不同的命名空间中。
答案 1 :(得分:0)
您可以将新添加的字段保留为可选字段。 请参阅此讨论What backward-compatible XSD changes can be made?了解详情
答案 2 :(得分:0)
问题是如何将字段添加到文档并将其发送到 所有系统都没有破坏他们的过程?
这取决于。
如果您可以重新编译所有其他系统,并且这些系统已经生成了自动代码以使用XSD(例如,他们使用类似xsd.exe
的.NET / C#或类似的其他语言),然后你可以简单地修改架构。
如果您可以重新编译所有其他系统,但他们已经手工制作了"用于解释和验证XML的代码,还有很多工作要做。这可能会阻止您在任何地方进行更改,但是:
在不同的工作中,如何让其他系统忽略添加的内容 场?
迈克尔凯和诺曼汗已经解释/指出了关于你问题的这个特定方面的优秀建议。
一般点
自动生成POCO代码,POJO源代码(如果有)是帮助项目的绝佳方式。困难在于,可用于此的工具在质量和完整性方面各不相同。
我认为 xsd.exe
非常好。我用过它,效果很好。
我为JSON模式尝试了C#代码生成器。 JSON模式本身很好 - 您可以表达类型,结构和大小/值约束(就像XSD和ASN.1)。我试过的C#代码生成器在没有涵盖完整的JSON模式标准方面令人失望。
我自己的经验主要是使用两种商业ASN.1工具。这些为ASN.1做了xsd.exe
对XSD / XML的作用。但是它们比xsd.exe更有用,因为它们包括:
ASN.1本身很有用
如果有人可以访问这些工具,那么就可以拥有一个涉及各种不同语言,平台和技术的极其异构的系统,它们之间的接口全部都是机器生成的。
这些用于ASN.1的商业工具需要花钱(比如很多),但是对于在很多不同语言和平台上进行大量复杂消息交互的大型项目来说,节省人力和价值是值得的。降低风险。
当遇到与您类似的问题时,我几乎可以在项目中的任何一点进行架构更改,只需要很少的人力(通常低至几分钟)来处理整个系统的后果。