2017-03-09 153 views
0

我有一个模式的XSD文件,用于定义从远程客户端向我的应用程序发送值的XML接口。现在,XSD有简单的说3个要素。XSD向后兼容性

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

这可以工作,但可以说我创建了XSD的新版本,并且新的第四个元素用于启用某些服务器端功能,如果为新的远程客户端指定此元素,但我仍然要支持旧的XSD(不想或可以更改旧的远程客户端的软件),但是从新的XSD生成的新类不会与旧的XSD中的旧XML兼容。

我想我可以直接用XDocument或类似的方法读取XML,但是我希望只接受可以针对XSD验证的XML的功能(然后根据哪个XSD版本进行服务器端决策它证实了)。这是由于客户关系问题。

解决此问题的最佳做法是什么?

回答

1

如果我正确地理解了你,那么如果你所要做的只是向模式中添加一个额外的元素,你就不需要支持多个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> 
1

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