XML Schema:用相应的模式替换导入

时间:2012-02-06 12:16:29

标签: java xml xsd

我有一个XML Schema,它包含多个导入,而这些导入又包含导入。我需要生成语义相同的模式,其中所有导入都是内联的。我想替换这些:

<xs:import namespace="http://some.name/" schemaLocation="./path/to/it.xsd"/>

包含引用的schemata的内容。我需要将输出作为字符串,而不是作为一些内部表示。

我尝试Apache Xerces但没有找到将XSModel写入字符串的方法。有吗?

我尝试Apache XmlSchema 2但是当它写XML Schema时,它不会用模式替换import声明。

有没有可以做到的图书馆?有什么建议吗?

感谢。

2 个答案:

答案 0 :(得分:10)

xsd:include通常可以内联,但xsd:import不能。这是因为xsd:import用于引用不同目标命名空间的模式文档,并且您不能在同一模式文档中拥有具有不同目标命名空间的组件。

答案 1 :(得分:5)

正如herehere指出的那样,XSD限制每个文件有一个目标命名空间使得“语义上等效”的请求无法解决。在名称空间本身用于定义(或细化)语义集的边界的所有场景中都是如此,也是典型的。

对于一次或设计时重构,您无需以经常方式或动态地以编程方式处理此类事物,您也可以尝试查看here;也许在你的情况下问题不是不支持导入(我会觉得奇怪),而是包含/导入的复杂性使得图形对于你的工具来说太复杂了。如后一篇文章所示,通过折叠包含,减少所需进口数量的净效应,问题得以解决。

或者,如果某种程度上你的“语义等价”不涉及命名空间(例如我看到人们对从XSD开发关系模型很感兴趣),通过重构可能会带来所有命名空间到一个(或没有,即没有目标命名空间),然后将其提供给您的工具。从自动重构的角度来看,这里唯一的问题是确保在不同的命名空间中没有重复的命名XSD组件;例如不能在不同的名称空间中为元素,类型,属性或组等赋予相同的名称。