我在java 1.4中使用xstream,而且我在元素中遇到了一些嵌入式xml的问题。
我有以下消息:
<detail>
<SwiftMessage><SWIFT>hi<SWIFT/><SwiftMessage/>
<detail/>
元素数据hi是SwiftMessage标记中保存的字符串。我可以看到Xstream正在看到这些并用
替换它们<SWIFT>hi<SWIFT/>
否则会产生无效的xml。我想知道的是有没有办法引用这个字符串来阻止xstream这样做。它是发送到另一个系统的JMS消息的一部分,他们不喜欢替换。
非常感谢对此的任何想法。
答案 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处理器会自动将<
替换为<
而>
替换为>
因为这些字符是为构造元素而保留的。
否则,如果您希望将SWIFT元素视为字符串值,则需要使用CDATA部分。