2011-11-28 8 views
6

2つのXSDスキーマAとBを比較して、スキーマAに有効なすべてのインスタンスドキュメントもスキーマBに有効であると判断したいと思います。スキーマAとBが「異なる」場合でも、スキーマAとBは事実上同じです。これが起こらない相違点の例は、スキーマAが型を使用し、スキーマBがそのすべての要素をインラインで宣言することです。2 xsdスキーマファイルと同等の機能を比較する方法

「スマート」diffタイプのツールについて多くの人が話していましたが、これらのファイルはテキストが異なるため結果が異なるため、2つのファイルが異なると主張します。 XSOMへの参照がいくつか見つかりましたが、それが役立つかどうかはわかりません。

進め方についてのご意見はありますか?

答えて

3

私のアプローチは、XMLスキーマの表現を正規化することでした。

残念ながら、XML文書の正規化(デジタル署名の計算に使用されています)とは異なり、単純ではなく、標準化されていないこともわかります。

基本的には、両方のXMLスキーマを「標準的な形式」に変換する必要があります。作成するツールや使用するツールがどのようなものであっても、それを比較して比較する必要があります。

ロシアのドールスタイルを使用して作成したXSDの比較が簡単であることから、必要なルート要素ごとにXMLスキーマセット(複数の名前空間がある場合は複数のファイルになる可能性があります)を作成する方法がありましたPSVIモデル

次に、置換グループの置換と組み合わせた自動置換置換グループメンバーなどのオプションを使用しました。 「余計な」XMLスキーマシーケンスの削除、単一のオプションの選択の崩壊、単一項目のコンポーザーのminOccurs/maxOccursの移動などが含まれます。

XSD対応の比較ツールの機能やビルドに応じて、 xsd:choiceやxsd:allなどのコンポーザーの下のパーティクルを再配置する必要があるかもしれません。

とにかく、私がすべてのことを学んだことは、そこにあるすべての "クールな" XSD機能にうってつけのツールを作るのは非常に難しいということでした。さまざまなxsd:任意のコンテンツ。

物事が以降に変更された場合にはかかわらず、私は疑問に思うん...

+0

私はちょうど行方不明だったいくつかの "単純な"方法があったことを私の希望を上げました。私が見つけられず、私の頭の中で立ち往生している記事は、XSOMの標準化であるXSDのラインに沿っていました。どのXSD対応の比較ツールを使用していましたか? –

+0

XSOMはXSDの正規化ではありません。おそらく彼らはXSOMがあなたのためにコンパイルするPSVIの「ビュー」を指していたでしょう。しかし、それは特定の、非常に基本的なシナリオでのみ使用できます。外部ツールで比較を行うには、カスタム変換を適用して新しいXSDを生成する必要があります。私は、PSVIビューをXSDファイルにシリアル化するXSOMを認識していません(またはまだ学んでいません)...私は自分自身でツール全体を書いてしまい、やがてそれをXML Schema Refactoringとしてブランド化しました。ロシアの人形への変換はバージョン1.0でも残っていませんでした。 –

4

Membrane SOA Model - Java API for WSDL and XML Schema

package sample.schema; 

import java.util.List; 
import com.predic8.schema.Schema; 
import com.predic8.schema.SchemaParser; 
import com.predic8.schema.diff.SchemaDiffGenerator; 
import com.predic8.soamodel.Difference; 

public class CompareSchema { 

    public static void main(String[] args) { 
    compare(); 
    } 

    private static void compare(){ 
    SchemaParser parser = new SchemaParser(); 

    Schema schema1 = parser.parse("resources/diff/1/common.xsd"); 

    Schema schema2 = parser.parse("resources/diff/2/common.xsd"); 

    SchemaDiffGenerator diffGen = new SchemaDiffGenerator(schema1, schema2); 
    List<Difference> lst = diffGen.compare(); 
    for (Difference diff : lst) { 
     dumpDiff(diff, ""); 
    } 
    } 

    private static void dumpDiff(Difference diff, String level) { 
    System.out.println(level + diff.getDescription()); 
    for (Difference localDiff : diff.getDiffs()){ 
     dumpDiff(localDiff, level + " "); 
    } 
    } 
} 

After executing you get the output shown in listing 2. It is a List of differences between the two Schema documents.

ComplexType PersonType has changed: Sequence has changed: 
    Element id has changed: 
     The type of element id has changed from xsd:string to tns:IdentifierType. 

http://www.service-repository.com/ 2 XSD間の違いのレポートが表示され、オンラインXML Schema Version Comparatorツールを提供していますメンブレンSOAモデルから生成されるように見えます。

+0

ダウンロード可能なバージョンが動作していません。内部のライブラリの1つに.classファイルがありません:スレッド "main"の例外java.lang.NoClassDefFoundError:org/codehaus/groovy/runtime/BytecodeInterface8。 LE:明らかに、groovy 1.8.6を手動でダウンロードしてビルドパスに追加すると動作します。 – Buffalo

+0

こんにちは..あなたの例を試しましたが、私のために働いていません。私は2つのスキーマファイルを比較しようとしています、1つは完全に構造化されていて、もう1つはインラインです(実際のスキーマはインポートを使用してインポートされます)。 ? –

+0

ありがとうございます。これは私がいつか立ち往生したことでした。どんな考え方でどのように違いをフィルタリングし、要素だけを削除して差異を表示させることができますか? – mattymanme

関連する問題