2011-11-09 24 views
12

Non c'è alcuna sorpresa per coloro che lavorano con i servizi Web molto di tanto in tanto vengono aggiornati. E devi sempre tenere traccia delle modifiche di questi aggiornamenti.Strumento di confronto XML/WSDL

Nel mio caso particolare ho a che fare con il servizio Web definito da WSDL e ottengo classi generate sulla base di questo WSDL.

Ma prima di rigenerare le classi da WSDL aggiornato mi piacerebbe vedere cosa è stato modificato in WSDL e determinare la quantità di modifiche - per vedere per cosa dovrei essere preparato.

Purtroppo, se si confrontano solo i file .wsdl della versione nuova e vecchia, non sempre funziona molto bene per una ragione - i contenuti di wsdl possono essere riordinati (refactored internamente). Questa è la ragione per trovare più strumenti semantici.

Ho provato lo strumento Oxygen XML Diff ma non funziona bene anche per me.

Sto cercando uno strumento che avrà due XMLs e mi portano solo le differenze semantiche, ad esempio:

  • Elemento Un aggiunto
  • Aggiunto sottoelemento b7 all'elemento B

Per questo per funzionare immagino che lo strumento debba caricare e analizzare profondamente la struttura, Oxygen XML Diff ha affermato di farlo bene, ma è solo una versione migliorata del confronto tra file di testo.

Potrebbe consigliare un lavoro per per questo, in particolare, per visualizzare gli aggiornamenti di servizi web basati su WSDL.

UPDATE 1: Nuova idea è confrontare fonti generate anziché WSDL.

Grazie.

risposta

13

http://membrane-soa.org ha un Java API for comparing WSDL nella loro SOA Model.

package sample.wsdl; 

import java.util.List; 
import com.predic8.wsdl.*; 
import com.predic8.wsdl.diff.WsdlDiffGenerator; 
import com.predic8.soamodel.Difference; 

public class CompareWSDL { 

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

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

    Definitions wsdl1 = parser.parse("resources/diff/1/article.wsdl"); 

    Definitions wsdl2 = parser.parse("resources/diff/2/article.wsdl"); 

    WsdlDiffGenerator diffGen = new WsdlDiffGenerator(wsdl1, wsdl2); 
    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 + " "); 
    } 
    } 
} 

Dopo l'esecuzione si ottiene l'output del Listato 2. Si tratta di un elenco di differenze tra i due documenti WSDL.

Port ArticleServicePTPort removed. 
Port ArticleServicePTPort2 added. 
Operation create removed. 
Operation create2 added. 
Schema http://predic8.com/wsdl/material/ArticleService/1/ has changed: 
    Element createResponse has changed: 
    ComplexType has changed: 
     Sequence has changed: 
     Element NewElementForTest added. 

Per un esempio di output dello strumento, http://www.service-repository.com/ offre una online WSDL Comparator tool che restituisce un rapporto delle differenze tra due WSDL. Il rapporto non è un semplice diff XML.

+1

Dalla versione 1.3 di SOA Model è possibile generare il report da uno strumento della riga di comando. Vedi: http://www.membrane-soa.org/soa-model-doc/1.3/cmd-tool/wsdldiff-tool.htm Voglio rivelare che sono un membro del progetto Modello SOA . – baranco

+0

Questo è bello, ma non risolve l'intero problema. Ad esempio, un nuovo elemento influisce su quali richieste e risposte? È difficile da dire, e questa è una domanda importante. –

3

Questo può essere solo una soluzione parziale, ma si potrebbe analizzare il vecchio e il nuovo WSDL in SOAPui.

Si dovrebbe essere in grado di dire dai metodi generati e l'esempio richiede che cosa è cambiato che si tratti di tipi o metodi.

speranza che è certo aiuto

+0

Non mi piace SOAPui, la sua interfaccia è così brutta e funziona male. Ho avuto una brutta esperienza con esso specialmente sulla piattaforma Mac. – Vladimir

+0

Inoltre la tua idea è buona. Ho già pensato che potrei confrontare le fonti delle classi generate che potrebbero funzionare per me anche senza SOAPui. – Vladimir