2010-03-26 39 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的請求......