我想比較2個XSD模式A和B,以確定對模式A有效的所有實例文檔對模式B也是有效的。我希望用它來證明即使模式A和B是「不同的」,它們實際上是相同的。這種不會觸發的差異示例是Schema A使用類型,而模式B聲明所有元素都是內聯的。如何比較2個xsd模式文件的等效功能
我發現很多人在談論「智能」diff類型的工具,但這些會聲稱這兩個文件是不同的,因爲它們具有不同的文本,但生成的結構是相同的。我發現了一些對XSOM的引用,但我不確定這是否有用。
關於如何進行的任何想法?
我想比較2個XSD模式A和B,以確定對模式A有效的所有實例文檔對模式B也是有效的。我希望用它來證明即使模式A和B是「不同的」,它們實際上是相同的。這種不會觸發的差異示例是Schema A使用類型,而模式B聲明所有元素都是內聯的。如何比較2個xsd模式文件的等效功能
我發現很多人在談論「智能」diff類型的工具,但這些會聲稱這兩個文件是不同的,因爲它們具有不同的文本,但生成的結構是相同的。我發現了一些對XSOM的引用,但我不確定這是否有用。
關於如何進行的任何想法?
我的做法是對XML模式的表示進行規範化。
不幸的是,我還可以告訴你,與XML文檔的規範化(用作計算數字簽名的例子)不同,它並不那麼簡單,甚至沒有標準化。
因此,基本上,您必須將XML Schema轉換爲「規範形式」 - 無論您構建或使用的工具是否認爲該形式爲,然後進行比較。
我的方法是爲我需要的每個根元素創建一個XML模式集(可能是多個文件,如果您有更多的名稱空間),因爲我發現比較使用俄羅斯娃娃風格創作的XSD更容易,從PSVI模型。
然後我使用了一些選項,例如自動匹配替換組成員以及替換替換組的替換;刪除「多餘的」XML Schema序列,摺疊單個選項選項或爲單個項目合成器移動minOccurs/maxOccurs,等等。
根據您的XSD感知比較工具的功能,或者您決定構建,您可能還必須在合成器下重新排列粒子,例如xsd:choice或xsd:all;等等。
無論如何,我最終學到的東西是,構建一個工具對於所有「酷」的XSD功能來說都非常好用是一件非常困難的事情......我記憶中的一個測試用例就是要處理與各種xsd:任何內容。
我不知道但如果事情從此改變......
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模型中產生的。
可供下載的版本無法正常工作。其中的一個庫缺少.class文件:線程「main」java.lang.NoClassDefFoundError中的異常:org/codehaus/groovy/runtime/BytecodeInterface8。 LE:顯然,如果您手動下載groovy 1.8.6並將其添加到構建路徑,它就可以工作。 – Buffalo
嗨..我試過你的例子,但它並沒有爲我工作。我試圖比較兩個模式文件,一個是完全結構化的,另一個是內聯的(實際模式是使用導入導入的)。請你幫我解決? –
謝謝。這是我堅持了一段時間。任何想法如何過濾差異,並只有元素刪除差異可見? – mattymanme
Darn我有我的希望,有一些「簡單」的方式,我只是失蹤。我找不到並貼在我腦海中的帖子是沿着XSOM的標準化XSD的標準化,然後可以進行比較。您使用了哪些XSD識別比較工具? –
XSOM不是XSD的標準化,當然;也許他們指的是XSOM爲你編譯的PSVI「視圖」。但是這隻能用於某些非常基本的場景。如果您希望外部工具爲您做比較,您仍然必須應用自定義轉換來生成新的XSD。我沒有意識到(或瞭解到)任何將PSVI視圖序列化爲XSD文件的XSOM ......我最終自己編寫了一個完整的工具,並最終將其標記爲XML Schema Refactoring;轉換到俄羅斯娃娃沒有生存1.0版本,雖然... –