0

我在 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 消息的一部分,他们不喜欢替换。

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

4

2 回答 2

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

于 2012-10-29T17:07:25.297 回答
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 部分。

于 2011-01-16T12:31:08.547 回答