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



我想比较两个XSD模式A和B,以确定所有对模式A有效的实例文档也对模式B有效。我希望用这个来证明,即使模式A和B"不同",它们实际上是相同的。模式A使用类型,而模式B声明它的所有元素都是内联的。

我发现很多人都在谈论"智能"diff类型工具,但这些工具会声称这两个文件是不同的,因为它们有不同的文本,但结果结构是相同的。我找到了一些XSOM的参考资料,但我不确定这是否有帮助。

对如何继续有什么想法吗?

膜式SOA模型- WSDL和XML模式的Java API

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所示的输出。它是一个列表两个Schema文档之间的差异

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架构版本比较器工具,该工具显示了两个XSD之间的差异报告,这些XSD似乎是由膜SOA模型生成的。

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

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

所以基本上,您必须将这两个XML schema转换为"规范形式"—无论您构建或使用的工具认为该形式是什么,然后进行比较。

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

然后使用诸如自动匹配替代组成员以及替换替代组的选项等选项;删除"多余的"XML模式序列,折叠单个选项或移动单个项目组合器的minOccurs/maxOccurs等

根据您的xsd感知比较工具的特性,或者您决定构建,您可能还必须在组合器(如xsd:choice或xsd:all;)下重新排列粒子。等。

不管怎样,我学到的是,构建一个工具,将工作很好,所有"酷"的XSD功能在那里是极其困难的…我记得很清楚的一个测试用例是处理各种xsd:any内容。