【问题标题】:XML Schema: replacing imports with corresponding schemaXML Schema:用相应的模式替换导入
【发布时间】:2012-02-27 22:03:44
【问题描述】:

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

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

包含引用模式的内容。而且我需要将输出作为字符串,而不是作为某种内部表示。

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

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

有没有图书馆可以做到这一点?有什么建议吗?

谢谢。

【问题讨论】:

  • 说来话长,这是我遇到的问题的可能解决方案

标签: java xml xsd


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 2014-12-27
      • 1970-01-01
      • 2022-01-08
      相关资源
      最近更新 更多