2011-11-28 15 views
6

Vorrei confrontare 2 schemi XSD A e B per determinare che tutti i documenti di istanza validi per lo schema A sarebbero validi anche per lo schema B. Spero di usarlo per dimostrare che anche se gli schemi A e B sono "diversi" sono effettivamente gli stessi. Esempi di differenze che non si innescherebbero sarebbero: Schema A utilizza i tipi e lo schema B dichiara tutti gli elementi in linea.Come confrontare 2 file di schema xsd per funzionalità equivalente

Ho trovato molte persone che parlano di strumenti di tipo "intelligente" diff, ma questi avrebbero affermato che i due file sono diversi perché hanno un testo diverso ma la struttura risultante è la stessa. Ho trovato alcuni riferimenti a XSOM ma non sono sicuro che ciò possa aiutare o meno.

Qualche idea su come procedere?

risposta

3

Il mio approccio a questo è stato quello di canonicalizzare la rappresentazione dello schema XML.

Purtroppo, posso anche dirvi che, a differenza della canonicalizzazione dei documenti XML (utilizzata, ad esempio, per calcolare una firma digitale), non è così semplice o addirittura standardizzata.

Quindi, in pratica, è necessario trasformare entrambi gli schemi XML in una "forma canonica", qualunque sia lo strumento che si costruisce o si utilizza, si ritiene che la forma sia, quindi effettuare il confronto.

Il mio approccio era creare un set di schemi XML (potrebbe essere più di un file se si dispone di più spazi dei nomi) per ogni elemento radice di cui avevo bisogno, poiché ho trovato più facile confrontare XSD creati usando lo stile di Russian Doll, a partire da il modello PSVI.

Ho quindi utilizzato opzioni come membri del gruppo di sostituzione di corrispondenza automatica accoppiati con la sostituzione di gruppi di sostituzione con una scelta; rimozione di sequenze di schemi XML "superflui", compressione di singole opzioni o spostamento di minOccurs/maxOccurs per compositori di articoli singoli, ecc.

A seconda delle funzionalità dello strumento di confronto compatibile con XSD, o se ci si accontenta di costruire, potrebbe anche dover riordinare le particelle sotto compositors come xsd: choice o xsd: all; ecc.

In ogni caso, quello che ho imparato dopo tutto è che è estremamente difficile creare uno strumento che funzioni bene per tutte le funzionalità XSD "interessanti" là fuori ... Un caso di prova che ricordo con affetto è stato trattare con vari xsd: qualsiasi contenuto.

Mi chiedo però se le cose sono cambiate da quando ...

+0

Darn ho sperato che ci fosse un modo "semplice" che mi mancava. Il post che non riesco a trovare ed è bloccato nella mia testa era lungo le linee di XSOM essendo la canonicalizzazione dell'XSD che sarebbe quindi in grado di essere confrontato. Quali strumenti di confronto con XSD sono stati utilizzati? –

+0

XSOM non è una canonicalizzazione dell'XSD, di sicuro; forse si riferivano alla "vista" PSVI che XSOM compila per te. Ma potrebbe essere usato solo per determinati scenari di base. Dovrai comunque applicare le tue trasformazioni personalizzate per generare nuovi XSD se desideri che gli strumenti esterni facciano il confronto per te.Non sono a conoscenza (o l'ho ancora appreso) di qualsiasi XSOM che serializzerebbe la vista PSVI in un file XSD ... Alla fine ho scritto un intero strumento e infine l'ho etichettato come un Refactoring XML Schema; la conversione in una bambola russa non è sopravvissuta alla versione 1.0 sebbene ... –

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/ offre una XML Schema Version Comparator strumento online che consente di visualizzare un rapporto delle differenze tra due XSD sembra essere prodotto dal modello SOA di Membrane.

+0

La versione disponibile per il download non funziona. Una delle librerie al loro interno manca di un file .class: Eccezione nel thread "main" java.lang.NoClassDefFoundError: org/codehaus/groovy/runtime/BytecodeInterface8. LE: a quanto pare funziona se si scarica manualmente groovy 1.8.6 e lo si aggiunge al percorso di compilazione. – Buffalo

+0

Ciao..ho provato il tuo esempio ma non funziona per me. Sto provando a confrontare due file schema, uno è completamente strutturato e l'altro è in linea (lo schema reale viene importato usando l'importazione). Potresti aiutarmi per favore ? –

+0

Grazie. Questo è quello che ho bloccato per qualche tempo. Qualche idea su come filtrare le differenze e rendere visibili solo le differenze rimosse da Element? – mattymanme