2011-11-28 19 views
6

Chciałbym porównać 2 schematy XSD A i B, aby ustalić, że wszystkie dokumenty instancji ważne dla schematu A będą również ważne dla schematu B. Mam nadzieję, że użyję tego do udowodnienia, że mimo że schematy A i B są "różne", są faktycznie takie same. Przykłady różnic, które nie byłyby wyzwalane, to Schemat A używa typów i Schemat B deklaruje wszystkie jego elementy w linii.Jak porównać pliki schematu 2 xsd dla równoważnej funkcjonalności

Znalazłem wiele osób mówiących o "inteligentnych" narzędziach typu diff, ale te twierdzą, że oba pliki są różne, ponieważ mają inny tekst, ale wynikowa struktura jest taka sama. Znalazłem kilka odniesień do XSOM, ale nie jestem pewien, czy to pomoże, czy nie.

Wszelkie uwagi dotyczące postępowania?

Odpowiedz

3

Moje podejście do tego było kanonizowanie reprezentacji schematu XML.

Niestety, mogę również powiedzieć, że w przeciwieństwie do kanonizacji dokumentów XML (używanego jako przykład do obliczenia podpisu cyfrowego), nie jest to tak proste, a nawet standaryzowane.

Tak więc, w zasadzie, musisz przekształcić oba schematy XML do "formy kanonicznej" - niezależnie od tego, jakie narzędzie zbudujesz lub używasz, myślisz, że jest to forma, a następnie dokonujesz porównania.

Moje podejście polegało na utworzeniu zestawu schematów XML (może być więcej niż jeden plik, jeśli masz więcej przestrzeni nazw) dla każdego wymaganego elementu głównego, ponieważ łatwiej było porównać XSD utworzone za pomocą stylu rosyjskiej lalki, zaczynając od model PSVI.

Następnie użyłem opcji, takich jak automatyczne dopasowywanie elementów grupy zastępczej w połączeniu z zastąpieniem grup podstawienia wyborem; usuwanie "niepotrzebnych" sekwencji schematów XML, zwijanie pojedynczych opcji opcji lub przenoszenie minOccurs/maxOccurs wokół pojedynczych elementów, itp.

W zależności od tego, jakie cechy narzędzia porównywania XSD są świadome, lub czy decydujesz się zbudować, może również zmienić układ cząsteczek pod kompozycjami, takimi jak xsd: choice lub xsd: all; itp.

W każdym razie, po tym wszystkim dowiedziałem się, że niezwykle trudno jest zbudować narzędzie, które będzie działało dobrze dla wszystkich "fajnych" funkcji XSD ... Jeden z przypadków testowych, który wspominam z czułością, dotyczył z różnymi xsd: dowolna treść.

Zastanawiam się jednak, czy wiele się zmieniło od ...

+0

Darn Miałem nadzieję, że istnieje jakiś "prosty" sposób, którego mi brakowało. Post, którego nie mogę znaleźć i utknąłem w mojej głowie, był zgodny z XSOM będącym kanoniczną wersją XSD, która mogłaby następnie zostać porównana. Jakich narzędzi do porównywania XSD używasz? –

+0

XSOM nie jest na pewno kanoniczną wersją XSD; może oni odnosili się do "widoku" PSVI, który XSOM kompiluje dla ciebie. Ale można to wykorzystać tylko w pewnych, bardzo podstawowych scenariuszach. Nadal musisz zastosować własne przekształcenia, aby wygenerować nowe XSD, jeśli chcesz, aby narzędzia zewnętrzne służyły do ​​porównania.Nie jestem świadomy (ani nie dowiedziałem się o tym) żadnego XSOM, który serializuje widok PSVI z powrotem do pliku XSD ... Skończyło się na tym, że napisałem całe narzędzie samodzielnie, i ostatecznie oznaczyłem je jako Refaktoryzację Schematu XML; konwersja na rosyjską lalkę nie przetrwała wersji 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/ oferuje internetowy XML Schema Version Comparator narzędzie wyświetla raport o różnicach między dwoma XSD który wydaje się być produkowany z modelu membranowego SOA.

+0

Wersja do pobrania nie działa. W jednej z bibliotek znajdujących się wewnątrz nie ma pliku .class: Wyjątek w wątku "main" java.lang.NoClassDefFoundError: org/codehaus/groovy/runtime/BytecodeInterface8. LE: najwyraźniej działa, jeśli ręcznie pobierzesz groovy 1.8.6 i dodasz go do ścieżki budowania. – Buffalo

+0

Hi .. Próbowałem Twój przykład, ale nie działa dla mnie. Próbuję porównać dwa pliki schematu, jeden jest w pełni zbudowany, a drugi jest inline (rzeczywisty schemat jest importowany za pomocą importu). Czy mógłbyś mi pomóc? ? –

+0

Dziękuję. To właśnie utknąłem na jakiś czas. Każdy pomysł, w jaki sposób można odfiltrować różnice i uwidocznić tylko różnice widoczne w Elementach? – mattymanme

Powiązane problemy