2010-08-25 54 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从“转义”恢复为“原始”。