我想比较2个XSD架构A和B,以确定对架构A有效的所有实例文档对架构B也有效。我希望用它来证明即使架构A和B“不同”它们实际上是一样的。这不会触发的差异示例是Schema A使用类型,Schema B声明所有内联元素。
我发现很多人都在谈论“智能”差异类型工具,但是这些工具会声称两个文件不同,因为它们有不同的文本,但结果结构是相同的。我发现了一些对XSOM的引用,但我不确定这是否有帮助。
有关如何进行的任何想法?
答案 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 :任何内容。
我确实感到奇怪,因为事情发生了变化......