XML / WSDL比较工具

时间:2011-11-09 11:06:52

标签: xml web-services wsdl

对于那些经常使用网络服务的人来说,他们不时会得到更新,这并不奇怪。而且您始终需要跟踪这些更新的更改。

在我的特定情况下,我处理由WSDL定义的Web服务,并且我获得了基于此WSDL生成的类。

但是在从更新的WSDL重新生成类之前,我希望看到WSDL中的更改内容并确定更改量 - 看看我应该为此做些准备。

不幸的是,如果我比较新版本和旧版本的.wsdl文件,由于一个原因并不总是很好 - wsdl内容可以重新排序(在内部重构)。这就是找到更多语义工具的原因。

我尝试过使用Oxygen XML Diff工具,但它对我来说效果不佳。

我正在寻找一种工具,它将采用两个XML并且只带来语义差异,例如:

  • 元素A添加
  • 将子元素b7添加到元素B

为了实现这一点,我猜这个工具必须加载并深入分析结构,Oxygen XML Diff声称做得很好,但它只是文本文件比较的改进版本。

您能否为此推荐一项工作,特别是要查看基于WSDL的Web服务更新。

更新1 :新想法是比较生成的源而不是WSDL。

谢谢。

3 个答案:

答案 0 :(得分:14)

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

执行后,您将获得清单2中显示的输出。它是一个列表   两个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.

有关该工具输出的示例,http://www.service-repository.com/提供了一个online WSDL Comparator tool,它返回两个WSDL之间差异的报告。该报告不是简单的XML差异。

答案 1 :(得分:6)

对于构建在SOA之上的任何系统,提出的问题实际上非常普遍。您通常有一些使用WSDL的消费者,或者使用相同WSDL的一些服务,现在需要更新WSDL。

  • 我们是否必须同时更新所有客户端和服务器(这很昂贵!)
  • 如果我们进行分阶段部署,如果更新的客户端调用未更新的服务,WSDL中的哪些操作会受到影响(损坏)?
  • 反过来,有些客户可以稍后更新吗?
  • XML结构如何变化?一些解析器是否可以容忍这些更改(例如,如果在序列的末尾找到一个新元素,则某些解析器不会中断,但如果在中间找到它则会中断)。

不,无论是WSDL的diff还是生成的XML的diff都不能可靠地帮助。

除了架构更改之外,WSDL还可以更改有效负载的结构(主体/标头),编码/限定,SOAP操作,绑定属性 - 任何一种都可能导致互操作性的丧失。

为了让事情变得更加棘手,输入中的某些类型的更改会使&#34;更新为旧的&#34;场景,而在输出中,它们应被视为不间断。例如,请求中的新可选元素将在传递时中断旧服务,但旧服务不会生成响应中的相同元素(因为它不知道它),并且元素缺少将是由更新的客户端容忍,因为该元素是可选的。

我的团队每周面对这些艰巨的任务。直到最近,我们对WSDL /模式文件进行了手动差异,并试图找出影响。有时很明显,但有时我们的方法会导致错误。我们需要更好的方法。

膜SOA有一些帮助。不幸的是,在某些情况下,它无法检测到架构中的更改,错误地将操作报告为未受影响,而实际上它已被破坏。从输出中还没有立即清楚地报告了什么情景(&#34;旧到更新&#34;或者#34;更新到旧&#34;)。

因此,经过几年的痛苦,我不得不编写自己的代码来回答上述问题,我可以直接向我们的B / PM提供影响评估的支持文档。

见这里:https://wsdldiff.mockmotor.com/

  1. 上传您的WSDL和架构:
  2. Upload WSDLs

    1. 该服务将为您提供影响摘要:更改是否中断,以及将影响的部署方案:
    2. Upload WSDLs

      1. 每个操作都标记为在端口和绑定中都有中断或不中断的更改:
      2. Upload WSDLs

        1. 您可以查看重大更改的详细信息(即架构/ wsdl更改导致它的原因)。例如,这里将一个必需元素添加到序列的中间:
        2. Upload WSDLs

          这并不是说人们应该盲目地依赖这样的工具,但在进行影响评估时会节省大量时间。

答案 2 :(得分:3)

这可能只是部分解决方案,但您可以在SOAPui中分析旧的和新的WSDL。

您应该能够从生成的方法和示例请求中判断出哪些类型或方法发生了变化。

希望这是一些帮助