【问题标题】:JAX-WS: Return String as CDATAJAX-WS:将字符串作为 CDATA 返回
【发布时间】:2013-12-04 11:09:55
【问题描述】:

我将 JAX-WS 与 JAX-WS 参考实现一起使用。我正在创建一个 Web 服务,它可以存储 XML,然后可以返回以前存储的 XML。

@WebMethod(operationName="store")
public void store(@WebParam(name="XML") String XML)
{
  ...
}

@WebMethod(operationName="retrieve")
public String retrieve()
{
  String s = XML;
  return s;
}

我的界面对 XML 使用字符串类型。当我发送 XML 数据时,我将整个字符串包装到一个 CDATA 标记中(因为我需要在肥皂消息中发送像 这样的字符)。然而,当 Web 服务稍后返回该 XML 数据时,奇怪的事情发生了:

如果字符串足够长,WS 会将所有内容包装到 CDATA 中,这就是我想要的方式。

但是,如果字符串真的很短(例如小型 XML 实例),则单个字符会被转义(例如 & 这样的字符,因为我存储了转义文本,这将被杀死并变成 &

如何强制我的 Web 服务始终在 CDATA 中返回字符串,而不自行转义任何内容?在返回值之前简单地在字符串之前和之后附加 <![CDATA[]]> 并没有帮助,因为 CDATA 标记本身会被转义。

顺便说一句:我认为我存储和检索 XML 的事实并不重要。如果我存储包含“”和“&”等字符的常用字符串(这基本上就是我所做的),也会出现同样的问题。如果我通过 CDATA 存储它们但不通过 CDATA 将它们取回,但每个特殊字符都独立转义,我必须自己重建整个字符串。返回字符串时如何强制使用 CDATA?

【问题讨论】:

  • 您是否考虑过只嵌套 XML,而不是将其嵌入为 String?它应该让你的生活更轻松。
  • 接收器中的 XML 解析器只会做正确的事情,无论字符串是包含在 CDATA 中还是单个字符被转义。您将得到所有转义已解决的原始字符串。

标签: java string web-services cdata


【解决方案1】:

虽然我同意@Henry 的观点,它应该可以正常工作(特别是因为您的类型是字符串),但如果您有一些特殊情况,您确实需要 CDATA 包装,无论如何:

我认为您必须创建一个 SOAPHandler(这样做有很多资源)。找到包含您的数据的元素。将文本内容和 XML 解码回您的“正常”字符串。请参阅此处的“创建 CData 节节点”:http://www.w3schools.com/dom/dom_nodes_create.asp。从元素中删除文本,使用您的内容创建并添加 CData 节点,这应该可以正常工作。

理论上,您也可以通过 JAXB (How to generate CDATA block using JAXB?) 这样做 - 刚刚找到链接,还没有尝试过。

【讨论】:

  • 谢谢,SOAPHandlers 看起来很有希望完成这项任务!明天我将对此进行深入尝试,看看我能走多远。
猜你喜欢
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
相关资源
最近更新 更多