2010-08-25 55 views
0

我在java 1.4中使用xstream,並且在元素中存在一些嵌入式xml的問題。包含使用xstream替換的其他xml字符的XML元素

我有以下消息:

<detail> 
<SwiftMessage><SWIFT>hi<SWIFT/><SwiftMessage/> 
<detail/> 

元素數據是喜是在SwiftMessage標籤舉行的字符串。我可以看到Xstream正在看到這些並將其替換爲

&lt;SWIFT&gt;hi&lt;SWIFT/&gt; 

否則它會創建無效的xml。我想知道的是有什麼方法可以引用這個字符串來防止xstream執行此操作。它是發送到另一個系統的JMS消息的一部分,他們不會喜歡替換。

非常感謝這方面的任何想法。

回答

0

這是XML的真實例子嗎?您的代碼收盤是錯誤的

<detail> 
<SwiftMessage><SWIFT>hi<SWIFT/><SwiftMessage/> 
<detail/> 

它應該是:

<detail> 
<SwiftMessage><SWIFT>hi</SWIFT></SwiftMessage> 
</detail> 

在元素名的末尾反斜線表示該元素是空的,就像一個HTML BR標籤:<br/>

所以你的XML是這樣說的:打開詳細標籤,打開SwiftMessage標籤,打開SWIFT標籤,文本嗨,添加空的SWIFT標籤,添加空的SwiftMessage標籤,添加空的詳細標籤。標籤實際上並未關閉。

我假設接收應用程序期望SWIFT元素爲有效的XML,而不是字符串?您可能需要展示如何添加SWIFT元素。如果你將其送到SwiftMessage元素的值它可能會被解釋爲一個字符串值,與XML處理器自動&lt;>&gt;,因爲這些字符是保留構建元素替換<

否則,如果您希望將SWIFT元素視爲字符串值,那麼您需要使用CDATA部分。

2

正如詹姆斯指出,嵌入式XML無法正常關閉,但主要觀點:任何XML的API必須轉義嵌入XML,以防止對XML格式的結構變化,即嵌入式XML是,必須解釋爲簡單的文本節點以防止「XML注入」。

如果我理解正確,問題的原因是發送和接收進程不對稱:您send(XStream.toXML(JMS.xml()))然後receive(JMS.xml())。 如果您將接收過程更改爲receive(XStream.fromXML(JMS.xml())),則XStream.fromXML()將解析XML,將嵌入的XML從「轉義」恢復爲「原始」。