2014-02-06 77 views
2

我正在使用JAX-WS服务。以下是请求类的一部分。SOAP请求XML中的CDATA节

@XmlElement(name = "Answers") 
protected String answers; 

现在,在实际的SOAP请求中,答案需要在XML中作为CDATA发送。有一个单独的存根类的答案。因此,我将该类的对象编组为xml。我围绕这个在CDATA标签,如下图所示:

xmlstr = "<![CDATA[" + xmlstr + "]]>"; 

因此,我请求XML应该是这样的:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
<S:Body> 
    <!-- Other tags --> 
    <Answers> 
     <![CDATA[ 
      <TagOne></TagOne> 
      <TagTwo></TagTwo> 
     ]]> 
    </Answers> 
</S:Body> 
</S:Envelope> 

然而,当请求被发送到服务器,从SOAPLoggingHandler,它看起来像这样:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
<S:Body> 
    <!-- Other tags --> 
    <Answers> 
     &lt;![CDATA[ 
      &lt;TagOne>&lt;/TagOne&gt;&#13; 
      &lt;TagTwo>&lt;/TagTwo&gt;&#13; 
     ]]&gt;&#13; 
    </Answers> 
</S:Body> 
</S:Envelope> 

由于这个字符的转义,我收到了答复说“无效的答案xml格式”。我有2个问题:

  1. 是xmlstr =“”从bean创建CDATA xml的正确方法是什么?如果没有,那么是否有任何标准的方法来做到这一点?

  2. 如果我想在不转义的情况下发送请求中的CDATA部分,那么我应该对我的实现进行哪些更改?

让我知道是否有其他需要。

+0

为什么它需要发送一个CDATA部分?数据在XML中的表示方式(在CDATA中如何表示,或者是带有用实体转义的特殊字符的简单表示形式)应该没有关系。 – Henry

+0

可能的重复[如何使用JAXB生成CDATA块?](http://stackoverflow.com/questions/3136375/how-to-generate-cdata-block-using-jaxb) – kolossus

回答

0

我认为这里的情况是你的java对象表示与你想在XML中看到的不一致。假设您将JAXB与JAX-WS一起使用,那么您可以使用XmlJavaTypeAdapter注释为bean中的元素创建适配器类。

public class CDATAAdapter extends XmlAdapter<String, String> { 

    @Override 
    public String marshal(String v) throws Exception { 
    return "<![CDATA[" + v + "]]>"; 
    } 

    @Override 
    public String unmarshal(String v) throws Exception { 
    return v; 
    } 
} 

在你的bean:

@XmlElement(name = "Answers") 
@XmlJavaTypeAdapter(value=CDATAAdapter.class) 
protected String answers; 

欲了解更多详情,请阅读Using JAXB 2.0's XmlJavaTypeAdapter

+1

它不适用于CDATA。结果与<相同[CDATA [< – Alex