2011-11-09 12 views
12

Nie ma niespodzianki dla tych, którzy pracują z usługami sieciowymi, ponieważ od czasu do czasu są aktualizowani. I zawsze musisz śledzić zmiany tych aktualizacji.Narzędzie porównujące XML/WSDL

W moim szczególnym przypadku mam do czynienia z usługą sieciową zdefiniowaną przez WSDL i otrzymuję klasy generowane na podstawie tego WSDL.

Ale przed regeneracją klas ze zaktualizowanego WSDL chciałbym zobaczyć, co zostało zmienione w WSDL i określić ilość zmian - aby zobaczyć, na co powinienem być przygotowany.

Niestety, jeśli porównam tylko pliki .wsdl nowej i starszej wersji, nie zawsze działa to bardzo dobrze z jednego powodu - zawartość wsdl może zostać ponownie uporządkowana (refaktoryzowana wewnętrznie). To jest powód, aby znaleźć więcej narzędzi semantycznych.

Próbowałem narzędzia Oxygen XML Diff, ale nie działa również dobrze dla mnie.

szukam narzędzie, które potrwa dwa plików XML i przynieś mi tylko różnice semantyczne, np

  • elementu A dodanego
  • Dodane podelement B7 z elementu B

Do tego do pracy Zgaduję, że narzędzie musi wczytać i dogłębnie przeanalizować strukturę, Oxygen XML Diff twierdziło, że robi to dobrze, ale to tylko ulepszona wersja porównania plików tekstowych.

Czy możesz polecić pracę w tym celu, w szczególności, aby zobaczyć aktualizacje w usługach internetowych opartych na WSDL.

UPDATE 1: Nowy pomysł polega na porównaniu wygenerowanych źródeł zamiast WSDL.

Dziękuję.

Odpowiedz

13

http://membrane-soa.org ma Java API for comparing WSDL w ich 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 + " "); 
    } 
    } 
} 

Po wykonaniu masz wyjścia pokazano na listingu 2. Jest Lista różnice między tymi dwoma dokumentami 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. 

Na przykład wyjście z narzędzia http://www.service-repository.com/ oferuje online WSDL Comparator tool zwracającą raport o różnicach między dwoma WSDL. Raport nie jest prostą różnicą XML.

+1

Od wersji 1.3 modelu SOA można wygenerować raport z narzędzia linii poleceń. Zobacz: http://www.membrane-soa.org/soa-model-doc/1.3/cmd-tool/wsdldiff-tool.htm Chcę ujawnić, że jestem członkiem projektu modelu SOA . – baranco

+0

To jest fajne, ale nie rozwiązuje całego problemu. Na przykład, nowy element wpływa na to, jakie wnioski i odpowiedzi? Trudno powiedzieć, i jest to ważne pytanie. –

3

To może być tylko częściowe rozwiązanie, ale można przeanalizować stary i nowy dokument WSDL w wersji SOAPui.

Powinieneś być w stanie stwierdzić na podstawie wygenerowanych metod i przykładowych żądań, co się zmieniło, niezależnie od tego, czy są to typy czy metody.

nadzieja, że ​​jest jakąś pomoc

+0

Nie lubię SOAPui, jego interfejs jest tak brzydki i działa źle. Mam bardzo złe doświadczenia z tym związane, zwłaszcza na platformie Mac. – Vladimir

+0

Poza tym twój pomysł jest dobry. Już myślałem, że mogę porównać źródła wygenerowanych klas, które mogłyby pracować dla mnie nawet bez SOAPui. – Vladimir