java - JAX-WS : Return String as CDATA

标签 java string web-services cdata

我正在将 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 类型 String。当我发送 XML 数据时,我将整个字符串包装到 CDATA 标签中(因为我需要在肥皂消息中发送 < 和 > 等字符)。然而,当 Web 服务稍后返回 XML 数据时,会发生奇怪的事情:

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

但是,如果字符串非常短(例如小型 XML 实例),则单个字符将被转义(例如 < 变为 <)。这不是我想要的,因为它使得处理数据变得非常困难。此外,如果我的字符串包含类似 & 的字符因为我存储了转义文本,所以它被杀死并变成 &amp;

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

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

最佳答案

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

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

理论上您也可以通过 JAXB ( How to generate CDATA block using JAXB? ) 执行此操作 - 刚刚找到该链接,尚未尝试。

关于java - JAX-WS : Return String as CDATA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20096272/

相关文章:

java - Spring Social 领英 : Is there an api available to retrieve user's projects?

java - 如何使用方法内部的 Java 匿名函数中获取的数据

python - 如何在特定字符(实际上是一组字符)处拆分字符串,但具有指定的长度

android - 没有得到特定日期作为返回

java - FileInputStream 是否有内部缓冲区

Java 嵌套忽略内部属性

c++ - 有一个不匹配的子串比较

java - Axis2 附件在响应中消失

java - Jersey Rest 客户端到 Apache CXF 客户端的转换

django - 使用 Postman 对 Django Web 服务进行 Http post 请求(需要登录信息)