2017-03-09 14 views
0

リモートクライアントからアプリケーションに値を送信するためのXMLインターフェイスを定義するためのスキーマを持つXSDファイルがあります。現在、XSDには3つの要素があると簡単に言えます。XSD下位互換性

これをC#でシリアライズしてデシリアライズするには、ツールxsd.exeを使用してC#クラスを生成し、これらのクラスを使用してXSDに対してXMLをシリアライズおよびデシリアライズすることができます。

これはうまくいきますが、XSDの新しいバージョンを作成し、新しいリモートクライアント用にこの要素が指定されていればサーバー側機能を有効にするための新しい4番目の要素を作成しますが、古いXSD(古いリモートクライアントのソフトウェアを変更したくない、または変更することはできません)が、新しいXSDから生成された新しいクラスは古いXSDの古いXMLと互換性がありません。

私はXDocumentなどで直接XMLを読むことができると思いますが、XSDのいずれかに対して検証できるXMLを受け入れるという機能が必要です(そして、XSDのバージョンそれに対して反対にする)。これは顧客関係の問題によるものです。

この問題に対処するベストプラクティスは何ですか?

答えて

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

ベストプラクティスを使用すると、複数のバリアントを処理する必要がある場合は特に、あなたのスキーマが変更される可能性がある場合の技術データバインディングを避けるためです。基本的に、XMLは柔軟性のために設計されており、C#のような言語はそうではありません。したがって、特定のスキーマを反映するようにC#コードをコンパイルすると、あなた自身がロックされます。一般的なアプローチ(DOMなど)を使用するか、XSLTやXQueryなどのXML固有の処理言語を使用します。