如何比较2个xsd模式文件以获得相同的功能

时间:2011-11-28 01:59:56

标签: xsd

我想比较2个XSD架构A和B,以确定对架构A有效的所有实例文档对架构B也有效。我希望用它来证明即使架构A和B“不同”它们实际上是一样的。这不会触发的差异示例是Schema A使用类型,Schema B声明所有内联元素。

我发现很多人都在谈论“智能”差异类型工具,但是这些工具会声称两个文件不同,因为它们有不同的文本,但结果结构是相同的。我发现了一些对XSOM的引用,但我不确定这是否有帮助。

有关如何进行的任何想法?

2 个答案:

答案 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 + "  ");
    }
  }
}
  

执行后,您将获得清单2中显示的输出。它是一个列表   两个架构文件之间的差异。

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/提供了一个在线XML Schema Version Comparator工具,可显示两个XSD之间差异的报告,这两个XSD似乎是从膜SOA模型中生成的。

答案 1 :(得分:3)

我的方法是规范化XML Schema的表示。

不幸的是,我还可以告诉您,与XML文档的规范化(例如,用于计算数字签名)不同,它并不是那么简单甚至是标准化的。

所以基本上,你必须将两种XML Schema转换为“规范形式” - 无论你构建或使用的工具是什么,都认为该形式是,然后进行比较。

我的方法是为我需要的每个根元素创建一个XML Schema集(如果你有更多的命名空间,可以是多个文件),因为我发现比较使用Russian Doll样式编写的XSD更容易,从PSVI模型。

然后我使用了自动匹配替换组成员等选项,并选择替换替换组;删除“多余的”XML Schema序列,折叠单个选项选项或为单个项目合成器移动minOccurs / maxOccurs等。

根据您的XSD感知比较工具的功能,或者您决定构建,您可能还需要重新排列合成器下的粒子,例如xsd:choice或xsd:all;等。

无论如何,我在所有这些之后学到的是,构建一个对所有“酷”XSD功能都很好的工具是非常困难的...我记得很喜欢的一个测试用例是处理各种xsd :任何内容。

我确实感到奇怪,因为事情发生了变化......