XSD向后兼容性

时间:2017-03-09 09:57:02

标签: c# xml xsd iot backwards-compatibility

我有一个带有模式的XSD文件,该模式用于定义XML接口,以便从远程客户端向我的应用程序发送值。现在,XSD有,简单地说3个元素。

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

这有效,但是我们可以说我创建了一个新版本的XSD,如果为新的远程客户端指定了这个元素,那么可以使用新的第四个元素来启用某些服务器端功能,但我仍然想支持旧的XSD(不希望或者可以更改旧远程客户端的软件),但是新XSD生成的新类不能与旧XSD中的旧XML兼容。

我想我可以直接使用XDocument或类似的东西阅读XML,但我想要的是只接受可以针对其中一个XSD验证的XML的功能(然后使用服务器 - 根据它验证的XSD版本来决定。这是由于客户关系问题。

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

2 个答案:

答案 0 :(得分:1)

如果我理解正确,那么如果您要做的只是向架构添加其他元素,则不应该支持多个XSD。相反,如果你设置了'minOccurs'对于此新元素,将值设置为0并重新生成CS文件并使用此文件对对象进行反序列化,这样可以允许您对元素存在时和不存在时的请求进行反序列化。然后,您可以只评估反序列化对象上的属性是否为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>

答案 1 :(得分:1)

如果您的架构可能会发生变化,最佳做法是避免数据绑定技术,特别是如果您需要处理多个变体。基本上,XML是为灵活性而设计的,而C#这样的语言则不是,所以如果你编译C#代码以反映特定的模式,那么你就是锁定自己。如果没有任何变化,数据绑定很好,但如果你需要处理变化和变化然后使用通用方法(如DOM)或使用特定于XML的处理语言,如XSLT和XQuery。