2010-03-26 38 views
7

我正在使用第三方Web服务,其定义和实现超出了我的控制范围。 此Web服务将在未来发生变化。从WSDL自动提取内联XSD到XSD文件

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

我的方法:

  1. 创建自己的XSD指称为Web服务的WSDL的XSD定义
  2. 使用Java(这XSD还包括XSD类型的额外信息很明显。)使用具有相同数据绑定框架的Java SOAP框架(如Axis2或CXF)从WSDL生成数据绑定类的XML数据绑定框架(如ADB或JiXB)这将使我能够直接在一般情况下使用Web服务检索的对象)

我将在我自己的XSD文件中使用但在WSDL中定义的XSD类型可能会发生更改。无论何时他们改变,我想再次自动处理XSD和WSDL数据绑定。 (如果改变是不够显著,这可能会引发一些开发工作(但通常不)。)

我的问题:

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

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

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

事情,我想避免:

  • 手动复制粘贴内联XSD到XSD文件
  • 任何手动步骤(如确定(我找了一个自动的过程)。手动包含内联类型的WSDL(WSDL的位置确实也会发生变化))
  • 在我自己的XSD中使用xsd:any。我想我自己的XSD文件是正确的。
  • 使用非Java技术(如.NET)
  • 大量的执行情况(但你将如何实现这样的提取线索,欢迎反正)

PS:我发现了一些类似的问题,但他们都有这样的回答:WTH你想这么做吗?这是我相当大的背景故事的原因。

回答

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) 
     } 
    } 
} 

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

+0

我早就猜到了这样的事情是必要的。我实际上希望有更多的框架,例如:** for(XmlSchema xmlSchema:wsdl.extractNamespaceSchemas())xmlSchema.writeFile(ns2FileName(xmlSchema.getTargetNamespace())); **啊,一个不完美的世界... – 2010-04-07 08:27:17

+0

@Steven :听起来像是一个开源项目的机会,让世界更接近完美;-) – 2010-04-07 11:33:45

2

只是为了保持这篇文章的相关性,自答案被接受以来事情已经发生了变化。 Java现在可以从WSDL开始生成你想要的东西; JAX-WS提供的工具完全符合要求:使用WSDL,创建一个客户端代理以及一堆JAXB注释的类,以便对请求进行取消/编组。

对于@MoizTankiwala的观点,我想说的是,需要从WSDL导出XSD内容(或将所有外部XSD内容包含在WSDL类型部分内)仍然存在。

当某人拥有大量XSD时,前者是有意义的,而且在XSD中对该模型的有效管理,分析和演变存在普遍关注。

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

other answer on SO有关类似谈判的需要,应该帮助至少有Moiz的请求......