包含使用xstream替换的其他xml字符的XML元素

时间:2010-08-25 06:47:49

标签: xml xstream

我在java 1.4中使用xstream,而且我在元素中遇到了一些嵌入式xml的问题。

我有以下消息:

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

元素数据hi是SwiftMessage标记中保存的字符串。我可以看到Xstream正在看到这些并用

替换它们
&lt;SWIFT&gt;hi&lt;SWIFT/&gt;

否则会产生无效的xml。我想知道的是有没有办法引用这个字符串来阻止xstream这样做。它是发送到另一个系统的JMS消息的一部分,他们不喜欢替换。

非常感谢对此的任何想法。

2 个答案:

答案 0 :(得分:2)

正如James指出的那样,你的嵌入式XML没有被正确关闭,但重点是:任何XML-API都必须逃避嵌入式XML以防止XML格式的结构变化,即嵌入式XML必须被解释为简单文本节点以防止“XML注入”。

如果我理解正确,问题的原因是发送和接收进程不对称:您send( XStream.toXML( JMS.xml() ) )然后是receive( JMS.xml() )。 如果您将接收程序更改为receive( XStream.fromXML( JMS.xml() ) ),则XStream.fromXML()将解析XML,将嵌入的XML从“转义”恢复为“原始”。

答案 1 :(得分:0)

这是您XML的真实示例吗?您的代码关闭错误

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

应该是:

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

元素名称末尾的反斜杠表示该元素为空,如html br标记:<br/>

所以你的XML就是这样说:打开详细信息标签,打开SwiftMessage标签,打开SWIFT标签,发送文字hi,添加空SWIFT标签,添加空SwiftMessage标签,添加空细节标签。标签实际上并未关闭。

我假设接收应用程序期望SWIFT元素是有效的XML而不是字符串?您可能需要显示如何添加SWIFT元素。如果将其提供给SwiftMessage元素的值,它可能会被解释为字符串值,您的XML处理器会自动将<替换为&lt;>替换为&gt;因为这些字符是为构造元素而保留的。

否则,如果您希望将SWIFT元素视为字符串值,则需要使用CDATA部分。