【问题标题】:importing only few type from one xsd to another仅将少数类型从一个 xsd 导入到另一个
【发布时间】:2018-08-09 20:15:01
【问题描述】:

这里的问题是——是否可以从 xsd 导入类型的子集?

考虑以下示例: A.xsd 包含三种类型 a,b,c 而 B.xsd 包含两种类型 d,e.

当我在 B.xsd 中导入 A.xsd 时,如下所示:

<xs:import namespace="http://www.abc.com/schema/aaa" schemaLocation="A.xsd"/>

我得到了所有三种类型——a、b 和 c。我只想在 B.xsd 中输入 a 。我想在 xsd 中排除类型 b 和 c。有可能这样做吗?如果是,有哪些选择?

谢谢 电脑

【问题讨论】:

  • 我从未见过这种情况,我问自己这有什么好处。某种类型的替换而不是覆盖?
  • 如果你只想要类型 A,你可以将类型 ns1:a 扩展为本地类型。
  • 感谢 Petru 和 Micheal 的投入。我正在处理的场景是使用 spring-ws 的基于肥皂的 Web 服务。它正在导入另一个定义了某些类型的 xsd。好的部分是,我可以重用 A.xsd 中定义的复杂类型。不好的部分是..我在最终的 wsdl 中得到了不需要的额外类型。所以这就是我寻找是否可以只导入模式子集的原因。

标签: xml xsd schema


【解决方案1】:

不,你不能这样做。但你为什么想要?多余的未使用的类型肯定没有坏处吗?

【讨论】:

    【解决方案2】:

    转述@Michael,No you can't do it. 如果您对某些规范阅读感兴趣,this is where 它已被描述。

    至于为什么有人要这样做,我可以举一个我经常看到的例子。我没有声称它适用于您的场景,但它应该可以帮助那些想知道为什么的人。

    这一切都始于大多数人对架构的期望:准确验证他们想要的东西,仅此而已。然后假设如果 XML 是有效的模式,那么在后面的代码中就没有或几乎没有验证。这可能是人们可以看到这么多问题的原因,即使在 SO 上也是如此,这些问题涉及似乎推动人们想要使用 XSD 做的各种验证场景。

    我经常遇到的是那些建立自己或参考(例如行业标准)这些精心设计的类型层次结构和替代组的人,他们意识到虽然在企业模型中拥有这样的类型是有意义的,但他们关心的是目的端到端视图,企业内的各个系统仅支持该类型层次结构的子集。

    当 XSD 被编写为遵循 开放内容 的某些模式(通过抽象元素或抽象类型化元素)时,包含这些额外类型或元素的模式需要通过具有xsi:type 引用了错误的类型或使用了错误的替换组成员。

    为了说明,考虑一个基本抽象类型Address;具体地址:加拿大、美国、墨西哥、英国。例如。对于特定的商业服务,使用英国地址而不是加拿大/美国/墨西哥是无效的。

    在您的情况下,假设类型 a 不依赖于 b 和/或 c,唯一的方法是将 A.xsd 拆分为 A 'aA'' 与其余部分,然后在您的 B.xsd 中引用 A'。有一些方法可以自动执行此操作,因此从维护角度来看,开销可能非常低;当通过自动 XML Schema Refactoring (XSR) 完成时,A.xsd 的未来版本(我认为不是您的)可以轻松地与您的解决方案的其余部分集成。

    【讨论】:

    • xs:redefine 是一个可怕的怪物,但它经常用于 Petru 描述的场景:您可以在包含的架构文档中重新定义某些内容,从而使英国地址变得无效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 2018-05-02
    相关资源
    最近更新 更多