我想比较两个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内容。