2013-11-20 53 views
1

我正在使用JAX-WS和JAX-WS參考實現。我正在創建一個Web服務來獲取XML,然後可以返回之前存儲的XML。JAX-WS:將字符串作爲CDATA返回

@WebMethod(operationName="store") 
public void store(@WebParam(name="XML") String XML) 
{ 
    ... 
} 

@WebMethod(operationName="retrieve") 
public String retrieve() 
{ 
    String s = XML; 
    return s; 
} 

My Interface對XML使用String類型。當我發送XML數據時,我將整個字符串包裝成一個CDATA-Tag(因爲我需要在soap消息中發送像<和>這樣的字符)。但是,當Web Service稍後返回該XML數據時,會發生奇怪的事情:

如果字符串足夠長,則WS將所有內容都包裝成CDATA,這就是我想要的方式。但是,如果字符串非常短(例如小XML實例),則單個字符會被轉義(例如,<變爲& lt;)。這不是我想要的,因爲它使得處理數據非常困難。此外,如果我的字符串包含&這樣的字符,因爲我存儲了轉義文本,這會被殺死並變爲&amp;

如何強制我的Web服務在CDATA中始終返回字符串,並且不會自行轉義任何內容?在返回值之前在字符串前後簡單追加<![CDATA[]]>並沒有幫助,因爲CDATA標記本身會被轉義。

順便說一句:我認爲我存儲和檢索XML的事實並不重要。如果我存儲包含字符'<','>'和'&'(這本質上就是我所做的)的常用字符串,問題也會如此。如果我通過CDATA存儲它們,但不通過CDATA取回它們,但每個特殊字符都會獨立地轉義出來,我必須自己重建整個字符串。如何在返回字符串時強制使用CDATA?

+1

您是否考慮過嵌套XML,而不是將其嵌入爲String?它應該讓你的生活更輕鬆。 – artbristol

+2

接收器中的XML解析器只會做正確的事情,無論該字符串是否包含在CDATA中或者是否有單個字符都已轉義。您將獲得所有轉義解決的原始字符串。 – Henry

回答

1

雖然我@Henry它應該只是工作(特別是因爲你的類型爲String)同意,如果你有一些特殊的情況下,你真的需要CDATA包裝不管:

我認爲你必須創建一個SOAPHandler(這樣做的資源很多)。找到包含數據的元素。將文本內容和XML解碼返回到「普通」字符串中。請參閱「創建CData節點」:http://www.w3schools.com/dom/dom_nodes_create.asp。從元素中刪除文本,使用你的內容創建和添加CData節點,這應該很好。

您理論上也可以通過JAXB(How to generate CDATA block using JAXB?) - 只找到鏈接,沒有嘗試過。

+0

謝謝你,SOAPHandlers看起來很有希望完成這項任務!我將在明天嘗試深入嘗試,看看我能得到多少。 – user2623674

相關問題