如何比较2个xsd模式文件的等效功能

如何比较2个xsd模式文件的等效功能,xsd,Xsd,我想比较两个XSD模式A和B,以确定对模式A有效的所有实例文档对模式B也有效。我希望用这一点来证明,即使模式A和B“不同”,它们实际上是相同的。这不会触发的差异示例是模式A使用类型,模式B内联声明其所有元素 我发现很多人都在谈论“智能”diff类型的工具,但他们会说这两个文件是不同的,因为它们有不同的文本,但结果结构是相同的。我找到了一些对XSOM的引用,但我不确定这是否有用 有没有关于如何继续的想法?我的方法是规范化XML模式的表示 不幸的是,我还可以告诉您,与XML文档的规范化(例如,用于计

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

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


有没有关于如何继续的想法?

我的方法是规范化XML模式的表示

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

因此,基本上,您必须将两个XML模式转换为“规范形式”——无论您构建或使用的工具认为该形式是什么,然后进行比较

我的方法是为我需要的每个根元素创建一个XML模式集(如果您有更多的名称空间,那么可以是多个文件),因为我发现比较使用俄罗斯玩偶风格编写的XSD更容易,从PSVI模型开始

然后,我使用了一些选项,例如自动匹配替换组成员,并使用一个选项替换替换组;删除“多余”的XML模式序列、折叠单个选项选项或移动单个项合成器的minOccurs/maxOccurs等

根据支持XSD的比较工具的功能,或者您决定构建,您可能还必须在诸如XSD:choice或XSD:all等合成器下重新排列粒子;等等

不管怎么说,我学到的是,要构建一个适合所有“酷”XSD特性的工具是非常困难的。。。我深深记得的一个测试用例是处理各种xsd:any内容

我确实想知道,自……以来情况是否发生了变化。


提供了一个在线工具,该工具显示两个XSD之间的差异报告,这两个XSD似乎是由膜SOA模型生成的。

Darn我希望有一些我刚刚错过的“简单”方法。我找不到并且一直停留在我脑海中的帖子是关于XSOM的,它是XSD的规范化,然后可以进行比较。您使用了哪些支持XSD的比较工具?XSOM肯定不是XSD的规范化;也许他们指的是XSOM为您编译的PSVI“视图”。但这只能用于某些非常基本的场景。如果需要外部工具为您进行比较,您仍然需要应用自定义转换来生成新的XSD。我还不知道(或者还没有听说)有任何XSOM会将PSVI视图序列化回XSD文件。。。最后我自己编写了一个完整的工具,并最终将其命名为XML模式重构;不过,转换成俄罗斯玩偶的版本在1.0版之后无法继续使用……可供下载的版本无法正常工作。其中一个库的线程“main”java.lang.NoClassDefFoundError:org/codehaus/groovy/runtime/BytecodeInterface8中缺少.class文件:Exception。LE:显然,如果你手动下载groovy 1.8.6并将其添加到构建路径中,它是有效的。嗨..我已经尝试了你的示例,但对我来说不起作用。我正在尝试比较两个模式文件,一个是完全结构化的,另一个是内联的(实际模式是使用导入导入导入的)。你能帮我一下吗?谢谢。这就是我坚持了一段时间的原因。你知道如何过滤这些差异并使只有元素移除的差异可见吗?
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 + "  ");
    }
  }
}
ComplexType PersonType has changed:   Sequence has changed:
    Element id has changed:
      The type of element id has changed from xsd:string to tns:IdentifierType.