2014-02-06 79 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