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

时间:2010-03-26 03:37:31

标签: java web-services xsd wsdl

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

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

我的方法:

  1. 创建我自己的XSD,参考被调用的Web服务的WSDL的XSD定义(显然,此XSD还包含XSD类型以获取额外信息。)
  2. 使用Java XML数据绑定框架(如ADB或JiXB)从步骤1中的我自己的XSD文件生成数据绑定类
  3. 使用具有相同数据绑定框架的Java SOAP框架(如Axis2或CXF)从WSDL生成数据绑定类(这将使我能够在生成XML时直接使用Web服务检索的对象。)
  4. 我将在我自己的XSD文件中使用的XSD类型,但是在WSDL中定义,可能会发生变化。每当它们发生变化时,我想再次自动处理XSD和WSDL数据绑定。 (如果变化足够大,这可能会触发一些开发工作。(但通常不会。)

    我的问题:

    在步骤1中,我需要一个XSD,指的是Web服务使用的相同类型。

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

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

    我想避免的事情:

    • 手动将内联XSD粘贴到XSD文件中(我正在寻找自动过程。)
    • 任何手动步骤。(就像手动确定包含内联类型的WSDL一样。(WSDL的位置确实也发生了变化。)
    • 在我自己的XSD中使用xsd:any。我希望自己的XSD文件是正确的。
    • 使用非Java技术(如.NET)
    • 大量的实施(但有关如何实施这种提取的提示,无论如何都是受欢迎的)
    PS:我发现了一些类似的问题,但他们都有这样的回答:WTH你想这样做吗?这就是我背景故事的原因。

2 个答案:

答案 0 :(得分:3)

我不知道任何库会为你做这件事,但绝对可以通过一点努力(约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)
        }
    }
}

这不是一个完整的解决方案,例如不处理在内联架构之外定义的名称空间前缀,但希望给出一个很好的起点。

答案 1 :(得分:2)

为了保持这篇文章的相关性,自收到答案以来,情况发生了变化。现在可以在Java中从WSDL生成您想要的内容; JAX-WS提供了 wsimport 工具,它完全按照要求执行:获取WSDL,创建一个客户端代理以及一组用于注释的JAXB注释类/编组请求。

我想说,对于@MoizTankiwala来说,从WSDL导出XSD内容(或者在WSDL的类型部分中包含所有外部XSD内容)的需求是充满活力的。

当有人拥有大量XSD时,前者是有意义的,并且人们普遍担心在XSD中有效管理,分析和发展该模型。

后者也受到追捧,因为当涉及到WSDL到客户端代理生成时,一些(主要)动态语言仍然缺乏工具的全面支持。

我的other answer on SO谈到类似的需求,至少应该对Moiz的请求有帮助......