2011-11-28 89 views
6

我想比較2個XSD模式A和B,以確定對模式A有效的所有實例文檔對模式B也是有效的。我希望用它來證明即使模式A和B是「不同的」,它們實際上是相同的。這種不會觸發的差異示例是Schema A使用類型,而模式B聲明所有元素都是內聯的。如何比較2個xsd模式文件的等效功能

我發現很多人在談論「智能」diff類型的工具,但這些會聲稱這兩個文件是不同的,因爲它們具有不同的文本,但生成的結構是相同的。我發現了一些對XSOM的引用,但我不確定這是否有用。

關於如何進行的任何想法?

回答

3

我的做法是對XML模式的表示進行規範化。

不幸的是,我還可以告訴你,與XML文檔的規範化(用作計算數字簽名的例子)不同,它並不那麼簡單,甚至沒有標準化。

因此,基本上,您必須將XML Schema轉換爲「規範形式」 - 無論您構建或使用的工具是否認爲該形式爲,然後進行比較。

我的方法是爲我需要的每個根元素創建一個XML模式集(可能是多個文件,如果您有更多的名稱空間),因爲我發現比較使用俄羅斯娃娃風格創作的XSD更容易,從PSVI模型。

然後我使用了一些選項,例如自動匹配替換組成員以及替換替換組的替換;刪除「多餘的」XML Schema序列,摺疊單個選項選項或爲單個項目合成器移動minOccurs/maxOccurs,等等。

根據您的XSD感知比較工具的功能,或者您決定構建,您可能還必須在合成器下重新排列粒子,例如xsd:choice或xsd:all;等等。

無論如何,我最終學到的東西是,構建一個工具對於所有「酷」的XSD功能來說都非常好用是一件非常困難的事情......我記憶中的一個測試用例就是要處理與各種xsd:任何內容。

我不知道但如果事情從此改變......

+0

Darn我有我的希望,有一些「簡單」的方式,我只是失蹤。我找不到並貼在我腦海中的帖子是沿着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/提供了一個在線工具XML Schema Version Comparator顯示兩個XSD之間的差異報告這似乎是從膜SOA模型中產生的。

+0

可供下載的版本無法正常工作。其中的一個庫缺少.class文件:線程「main」java.lang.NoClassDefFoundError中的異常:org/codehaus/groovy/runtime/BytecodeInterface8。 LE:顯然,如果您手動下載groovy 1.8.6並將其添加到構建路徑,它就可以工作。 – Buffalo

+0

嗨..我試過你的例子,但它並沒有爲我工作。我試圖比較兩個模式文件,一個是完全結構化的,另一個是內聯的(實際模式是使用導入導入的)。請你幫我解決? –

+0

謝謝。這是我堅持了一段時間。任何想法如何過濾差異,並只有元素刪除差異可見? – mattymanme