如何以动态方式使用JAXB来浏览CDATA部分

时间:2015-11-05 15:31:56

标签: jaxb escaping cdata

我试图让我的SOAP请求的一部分看起来像这样:

<![CDATA[<?xml version="1.0" encoding="UTF-8"?><placeholder  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="WirelessEdgeInfo_v1_0.xsd"/>]]>

但是,在它被底层JAXB转义后它看起来像这样:

&lt;![CDATA[&lt;?xml version="1.0"
            encoding="UTF-8"?&gt; &lt;placeholder
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:noNamespaceSchemaLocation="WirelessEdgeInfo_v1_0.xsd"/&gt;]]&amp;gt

我已经看了很多例子,例如使用MOXy并实现了一个CharacterEscapeHandler适配器或XmlAdapter,但问题是所有这些实现都是一样的。也就是说,它始终归结为:

marshaller.setProperty(CharacterEscapeHandler.class.getName(),
                new XmlCharacterHandler());

在编组器中设置属性。

但是,就我而言,我正在使用通过WSImport生成的注释来在我执行客户端SOAP调用时动态生成我的Web服务代码。

即。我无法访问marshaller对象。

对我来说,如果我不能在marshaller类型上设置任何属性,我怎么能解除我需要传入的String变量的CDATA部分?

我可以以某种方式&#34; hack&#34;或欺骗JAXB告诉它不要逃避CDATA值?或者我可以使用注释或以某种方式动态指示unescaping?

我通过注释尝试了以下适配器,但当然这不起作用:

    @XmlJavaTypeAdapter(value=CDATAAdapter.class) //this is not working right now
protected String variableXmlContent;

variableXmlContent仍然最终被转义。我也试过unescaping variableXmlContent并将其设置为输入值,但它仍以同样的方式出现,未转义。

1 个答案:

答案 0 :(得分:0)

marshaller使用<, >, &转义包含&lt;, &gt;, &amp;的XML元素值。

因此,如果XML元素应该包含

<![CDATA[ ... ]]>

XML文件中的结果将是

&lt;![CDATA[ ... ]]&gt;

我怀疑要作为XML元素传递的文本是

<?xml version="1.0" ... v1_0.xsd"/>

现在,如果我必须手动将其写入XML文件,我将其写入&#34; CDATA部分&#34;,但是(JAXB)marshaller将把这三个字符视为我之前描述的那就是它。

&lt;?xml version="1.0" ... v1_0.xsd"/&gt;

尝试使任何XML编组器使用CDATA机制是没有意义的,并且没有&#34; CDATA值&#34;需要特殊处理 - 所以没有这种特殊待遇。