2012-10-05 70 views
1

我有一個XML文檔作爲一個字符串,它是一個SOAP請求,沒有SOAP信封。我現在需要做到以下幾點:在Java 1.5中使用SOAP信封封裝和展開XML

  • 後請求包裝在SOAP信封
  • 返回一個Web服務,它的SOAP信封響應解開

實際HTTP連接的東西是好的,但我真的很糾結於包裝和解包。我試圖找出如何在Java中執行這種XML操作,但無法真正弄清楚。例如,看看javax.xml pacakge,但發現它最多隻是一個巨大的混亂。不幸的是,我僅限於Java 1.5,並且沒有外部庫,否則我可能會使用一些apache commons或其他東西。

基本上就是我要找的就是這樣的一對方法:

/* Wraps the xml in a standard soap envelope */ 
String wrap(String xml) 

/* Removes soap envelope from the xml */ 
String unwrap(String xml) 

wrap方法,我想可能是因爲soapStart + xml + soapEnd那樣簡單,雖然XML頭可能把事情搞得一團糟,如果不小心。但是對於我來說,展開對我來說太棘手,因爲您需要實際提取<soapenv:Body>中的內容,確保獲得所需的名稱空間聲明等。

我一直坐在這裏幾個小時,我仍然不知道...希望一些你們這樣做:)

回答

0

消息的SOAP部分包含包含體(可以包含一個信封數據或故障信息)和可選標題。當您使用JAXM創建SOAP消息時,會爲您創建SOAP部件,信封和主體:您只需創建主體元素。要做到這一點,你需要到body元素的父節點,即SOAP主體。

爲了到達SOAPMessage樹中的任何對象,必須從根開始遍歷樹,如以下代碼行所示。例如,假設的SOAPMessage是MyMsg,這裏是你將不得不爲了得到SOAP體打的電話:

SOAPPart MyPart = MyMsg.getSOAPPart(); 

SOAPEnvelope MyEnv = MyPart.getEnvelope(); 

SOAPBody MyBody = envelope.getBody(); 

在這一點上,你可以創建一個body元素的名稱(如描述命名空間)並將body元素添加到SOAPMessage。

Name bodyName = envelope.createName("Temperature"); 

下一個代碼行添加體元件到主體:

SOAPBodyElement myTemp = MyBody.addBodyElement(bodyName); 

例如,下面的代碼線的主體元素創建的名稱(XML標籤的表示)

最後,該代碼定義了一些數據本體元件bodyName:

myTemp.addTextNode("98.6"); 

參見ence:http://docs.oracle.com/cd/E19263-01/817-6026/SOAP.html

+0

我怎麼導入以訪問這些SOAP類? – Svish

+0

我相信他們是Java 6 SE的一部分java.xml.soap包 – Anshu

+0

啊......我只限於Java 5:/ – Svish

1

您可能會嘗試使用正則表達式。 要找到信封內容:

String regex = "^<(soapenv:Envelope).*?>(.*?)</\\1>$"; 
Pattern pattern = Pattern.compile(regex, Pattern.DOTALL); 
Matcher matcher = pattern.matcher(xml); 
matcher.matches(); 
String body = matcher.group(2); 

像這樣的事情

+1

是的,想到了這一點,它可能會工作,如果它不是命名空間。 – Svish

+0

如果我理解你,你可以嘗試更復雜的正則表達式: String regex =「^ <([a-zA-Z0-9:] *)[^> \」] * +(?:\「[^ \ ] * + \「[^> \」] * +)* +>(。*?) $「來提取封閉元素的內容 – Mikhail