Xmlベースのドキュメントのさまざまな非互換形式を管理するにはどうすればよいですか

StackOverflow https://stackoverflow.com/questions/1201077

質問

Xmlベースの形式でドキュメント(単語ドキュメントを考える)を保存するアプリケーションがあります-現在、xsdファイルから生成されたC#クラスはドキュメントフォーマットの読み取り/書き込みに使用され、変更を加える必要があったときまですべて順調でしたドキュメントの形式。私の懸念は、アプリケーションの将来のバージョンが以前のすべてのバージョンで保存されたドキュメントを読むことができるように必要であり、理想的には保存されたドキュメントの読み取りを古いバージョンのアプリでうまく処理できるようにしたいという後方互換性ですアプリの将来のバージョンごと。

たとえば、ドキュメントのスキーマを変更して(オプションの)余分な要素をどこかに追加すると、アプリケーションの古いバージョンは余分な要素を無視するだけで問題ありません:

<doc>
    <!-- Existing document -->
    <myElement>Hello World!</myElement>
</doc>

ただし、重大な変更が行われた場合(属性が要素や要素のコレクションなどに変更された場合)、アプリの過去のバージョンでは、この要素がオプションである場合は無視するか、ユーザーに通知する必要がありますそれ以外の場合、アプリの新しいバージョンで保存されたドキュメントを読み取ろうとしています。また、これは現在、私の2つの異なるドキュメントを読むためにアプリのすべての将来のバージョンが完全に別個のコードを必要とするため、頭痛の種となっています。

このような変更の例は、次のxmlです。

<doc>
    <!-- Existing document -->
    <someElement contents="12" />
</doc>

変更先:

<doc>
    <!-- Existing document -->
    <someElement>
        <contents>12</contents>
        <contents>13</contents>
    </someElement>
</doc>

将来のサポートの頭痛を防ぐために、私は将来行うかもしれない変更を処理するためのまともな戦略を考え出したかったので、現在リリースしている私のアプリのバージョンはこれらに対処できるようになります将来の変更:

  • 「バージョン番号」が必要ですドキュメントのドキュメント自体に保存され、もしそうならどのバージョン管理戦略が使用されるべきですか?ドキュメントバージョンが.exeアセンブリバージョンと一致する場合、またはより複雑な戦略を使用する必要がある場合(たとえば、メジャーリビジョンの変更は重大な変更を示し、マイナーリビジョンの増分は非重大な変更を示します-追加のオプション要素など)
  • ドキュメント自体を読むにはどのような方法を使用する必要がありますか。また、ドキュメントの異なるバージョンに対して大量のコードを複製しないようにするにはどうすればよいですか?
    • XPathは明らかに最も柔軟性がありますが、xsdを使用して単純にクラスを生成するよりも、実装する作業がはるかに多くなります。
    • 一方、DOM構文解析を使用する場合、各重大な変更に対してソース管理でドキュメントxsdの新しいコピーが必要になり、古いスキーマに修正を適用する必要がある場合に問題が発生します(古いバージョンのアプリは引き続きサポート)。

また、私はすべての変更を「変更を加える」というこれら2つのカテゴリに分割できるという前提で、このすべてを非常にゆるやかに取り組んできました。と「重大な変更」」がありますが、これが安全な仮定であると完全に確信しているわけではありません。

「ドキュメント」という用語を使用していることに注意してください。非常に大まかに-コンテンツはまったくドキュメントに似ていません!

私に提供できるアドバイスをありがとう。

役に立ちましたか?

解決

XMLファイルには必ずバージョン番号が必要です。実際には別のエンティティであるため、アプリケーションのバージョンに結び付けないことをお勧めします。 XML形式を変更せずにアプリの2つまたは3つのバージョンを使用することも、1つのリリースの開発中に形式を複数回変更することもできます。

アプリケーションの古いバージョンがXMLファイルの新しいバージョンを読み取れるようにする場合、要素を削除したり、名前を変更したりすることはできません。いつでも要素を追加でき、古いコードは喜んでそれらを無視します(XMLの優れた機能の1つ)が、それらを削除すると古いコードは機能しなくなります。

イシュマエルが言ったように、XSLTはXML形式をあるバージョンから別のバージョンに変換する良い方法であり、ソースコード内の解析ルーチンの山に巻き込まれないようにします。

他のヒント

XSLTはここでは明らかな選択です。ドキュメントのバージョンを識別できることを前提に、スキーマの各バージョンについて、以前のバージョンを新しいバージョンに変換するXSLTを作成します。

現在のバージョンに到達するまで、変換を順番に適用できます。したがって、最新のドキュメントバージョンのみを編集することになります。もちろん、古い形式で保存することはできず、古いバージョンのドキュメントが破損する可能性がありますが、これは多くのアプリケーションの典型です。どうしても古いバージョンに保存する必要がある場合は、逆の変換を作成するだけです。

@Andyのように、アプリのメジャービルド番号を使用します。

バージョンを指定してルート要素に属性を追加できますか?

これにより、古いバージョンが破損することはなく、ソフトウェアの新しいバージョンでは属性が表示され、異なるロード方法に適切に切り替わります。

バージョン番号自体は、リリースの頻度に依存します。個人的には、フォーマットが頻繁に変更されると予測しない限り、ソフトウェアのメジャービルド番号を使用します。

編集:コードの重複について少し気づいただけです:

そのためには、次のようなFactoryパターンを使用します。

LoadDocument
DoNonVersionDependingLoading
VersionSpecificLoaderFactory(VersionNumber)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top