5

Xmlベースの形式でドキュメント(Wordドキュメントを考える)を保存するアプリケーションがあります-現在、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 つのカテゴリに分割できるという仮定に基づいて、これらすべてを非常に大まかに作業しましたが、これが安全な仮定であると完全に確信しているわけではありません作る。

私が「ドキュメント」という用語を大まかに使用していることに注意してください。内容はドキュメントとはまったく似ていません。

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

4

3 に答える 3

4

ここでは XSLT が当然の選択です。ドキュメントのバージョンを特定できる場合、スキーマの各バージョンについて、以前のバージョンを新しいバージョンに変換する XSLT を作成します。

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

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

于 2009-07-29T16:18:39.397 に答える
4

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

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

Ishmael が言ったように、XSLT は XML 形式をあるバージョンから別のバージョンに変換するための優れた方法であり、ソース コードに解析ルーチンの山が山積みになることはありません。

于 2009-07-29T16:36:39.667 に答える
0

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

そうすれば、古いバージョンが壊れることはなく、ソフトウェアの新しいバージョンは属性を認識し、別のロード方法に適切に切り替わります。

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

編集:コードの重複について少し気づきました:

そのためには、次のようなファクトリパターンを使用します。

LoadDocument
DoNonVersionDependingLoading
VersionSpecificLoaderFactory(VersionNumber)
于 2009-07-29T15:28:16.703 に答える