【问题标题】:XSD Backward compatibilityXSD 向后兼容性
【发布时间】:2017-03-09 09:57:02
【问题描述】:

我有一个 XSD 文件,其架构用于定义 XML 接口,用于从远程客户端将值发送到我的应用程序。现在,为了简单起见,XSD 有 3 个元素。

因此,为了在 C# 中序列化和反序列化,我可以使用工具 xsd.exe 生成 C# 类,并使用这些类针对 XSD 序列化和反序列化 XML。

这可行,但是假设我创建了一个新版本的 XSD,如果为新的远程客户端指定了该元素,则使用新的第四个元素启用一些可用的服务器端功能,但我仍然想支持旧的XSD(不希望也可以更改旧远程客户端的软件),但新 XSD 生成的新类不会与旧 XSD 中的旧 XML 兼容。

我想我可以使用 XDocument 或类似文件直接读取 XML,但我希望具有只接受可以针对其中一个 XSD 进行验证的 XML 的功能(然后根据它的 XSD 版本做出服务器端决定验证反对)。这是由于客户关系问题。

处理此问题的最佳做法是什么?

【问题讨论】:

    标签: c# xml xsd iot backwards-compatibility


    【解决方案1】:

    如果我对您的理解正确,那么您不需要支持多个 XSD,如果您想要做的只是向架构添加一个额外的元素。相反,如果您将此新元素的“minOccurs”值设置为 0 并重新生成 CS 文件并使用它来反序列化您的对象,这应该允许您反序列化元素何时存在以及何时不存在的请求展示。然后,您可以评估反序列化对象上的 Property 是否为 null 以确定是否应启用新功能。请参阅下面的示例 XSD:

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="ClassName" nillable="true" type="ClassName" />
      <xs:complexType name="ClassName">
        <xs:sequence>
          <xs:element minOccurs="0" maxOccurs="1" name="Property1" type="Property1Type" />
          <xs:element minOccurs="0" maxOccurs="1" name="Property2" type="Property2Type" />
        </xs:sequence>
      </xs:complexType>
    </xs:schema>
    

    【讨论】:

      【解决方案2】:

      如果您的架构可能发生变化,最好避免使用数据绑定技术,尤其是当您需要处理多个变体时。基本上,XML 是为灵活性而设计的,而 C# 之类的语言则不是,因此,如果您编译 C# 代码以反映特定模式,那么您将自己锁定在其中。如果没有任何变化,数据绑定非常好,但如果您需要处理变化和变化然后要么使用通用方法(如 DOM),要么使用特定于 XML 的处理语言,如 XSLT 和 XQuery。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多