XSD 向后兼容性

XSD Backward compatibility

我有一个 XSD 文件,其中包含用于定义 XML 接口的架构,用于将值从远程客户端发送到我的应用程序。现在,XSD 有,让我们简单地说 3 个元素。

因此,为了在 C# 中对此进行序列化和反序列化,我可以使用工具 xsd.exe 生成 C# 类 并使用那些 类 来序列化和反序列化 XML关于 XSD.

这行得通,但假设我创建了一个新版本的 XSD,如果为新的远程客户端指定了此元素,则使用新的第四个元素启用某些服务器端功能,但我仍然想支持旧的 XSD(不想也不能更改旧的远程客户端的软件),但是从新的 XSD 生成的新的 类 将不兼容旧的 XMLs 来自旧的 XSD.

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

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

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

最佳做法是,如果您的模式可能会发生变化,尤其是当您需要处理多个变体时,请避免使用数据绑定技术。基本上,XML 是为灵活性而设计的,而像 C# 这样的语言则不是,因此,如果您编译 C# 代码以反映特定的模式,那么您就会陷入困境。如果没有任何变化,数据绑定就很好,但如果您需要处理多样性和变化,然后使用通用方法(例如 DOM)或使用 XML 特定的处理语言,例如 XSLT 和 XQuery。