java - 自动将内联 XSD 从 WSDL 提取到 XSD 文件中

标签 java web-services xsd wsdl

我正在使用第三方 Web 服务,其定义和实现超出我的控制范围。 此 Web 服务将来会发生变化。

Web 服务应该用于生成一个 XML 文件,其中包含一些与 Web 服务相同的数据(由相同的 XSD 类型表示)以及程序生成的一些额外信息。

我的方法:

  1. 创建我自己的 XSD,引用被调用 Web 服务的 WSDL 的 XSD 定义(这个 XSD 显然还包括额外信息的 XSD 类型。)
  2. 使用 Java XML 数据绑定(bind)框架(如 ADB 或 JiXB)从第 1 步中我自己的 XSD 文件生成数据绑定(bind)类
  3. 使用具有相同数据绑定(bind)框架的 Java SOAP 框架(如 Axis2 或 CXF)从 WSDL 生成数据绑定(bind)类(这将使我能够在生成 XML 时直接使用 Web 服务检索的对象。)

我将在自己的 XSD 文件中使用但在 WSDL 中定义的 XSD 类型可能会发生变化。每当它们发生变化时,我想再次自动处理 XSD 和 WSDL 数据绑定(bind)。 (如果变化足够大,这可能会触发一些开发工作。(但通常不会。))

我的问题:

在第 1 步中,我需要一个引用与 Web 服务使用的相同类型的 XSD。

WSDL 指的是另一个 WSDL,后者指的是另一个 WSDL 等等。最终有一个 WSDL 具有所需的内联 XSD 类型。据我所知,没有办法直接从 XSD 引用 WSDL 的内联 XSD 类型。

我认为最可行的方法是在自动处理(数据绑定(bind)之前)中包含一个额外步骤,将内联 XSD 从 WSDL 提取到其他 XSD 文件中。然后我自己的 XSD 文件可以引用这些其他 XSD 文件。

我想避免的事情:

  • 手动将内联 XSD 复制粘贴到 XSD 文件中(我正在寻找自动过程。)
  • 任何手动步骤。(例如手动确定包含内联类型的 WSDL。(该 WSDL 的位置也会发生变化。))
  • 在我自己的 XSD 中使用 xsd:any。我希望我自己的 XSD 文件是正确的。
  • 使用非 Java 技术(如 .NET)
  • 大量的实现(但无论如何都欢迎提示您将如何实现这种提取)

PS:我发现了一些类似的问题,但他们的回答都是这样的:WTH would you want to do that?这就是我相当大的背景故事的原因。

最佳答案

我不知道有任何库可以为您执行此操作,但绝对可以通过一些努力(约 200 行)来实现。生成所有内联和包含的 XSD 的粗略元程序:

method processWSDL(Document wsdl) {
    for each ("/wsdl:definitions/wsdl:types/xsd:schema" in wsdl) {
        call processXSD("inline_[i].xsd",".")
    }
    for each ("/wsdl:definitions/wsdl:import" in wsdl) {
        Document x = read and parse ("@location")
        if (x is WSDL) call processWSDL(x)
        else if (x is XSD) call processXSD("@location", x)
    }
}

method processXSD(String filename, Document xsd) {
    write "xsd" to a new file "filename"   // if 'filename' is a URL, take only the part after the last '/'
    for each ("/xsd:schema/xsd:import" or "/xsd:schema/xsd:include" in xsd) {
        if ("@schemaLocation" is local reference) {     // no 'http://' prefix
            Document x = read and parse ("@schemaLocation")
            call processXSD("@schemaLocation", x)
        }
    }
}

这不是一个完整的解决方案,例如不处理在内联模式之外定义的命名空间前缀,但希望能提供一个良好的起点。

关于java - 自动将内联 XSD 从 WSDL 提取到 XSD 文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2521008/

相关文章:

java - 如何使用java知道web容器的路径?

xml - 从 xsd 架构引用 spring bean 值

java - 调用 Restful Webservice 时 Uri 不是绝对异常

java - 如何抑制警告 EJB THREE-1337 :do not get webservice context property

带有属性的 XML 模式限制

java - JAXB 从 xsd 生成类始终具有 @XmlElement(required=true)

java - 确定 OutOfMemory 错误点

java - 如何使用单选按钮在单个 JSP 页面上显示多个问题

java - 如何在 linux 中为 java 安装

web-services - Paypal 如何从那里保护客户数据 业务合作伙伴?