2017-03-09 173 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)。