我试图让我的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转义后它看起来像这样:
<![CDATA[<?xml version="1.0"
encoding="UTF-8"?> <placeholder
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="WirelessEdgeInfo_v1_0.xsd"/>]]&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并将其设置为输入值,但它仍以同样的方式出现,未转义。
答案 0 :(得分:0)
marshaller使用<, >, &
转义包含<, >, &
的XML元素值。
因此,如果XML元素应该包含
<![CDATA[ ... ]]>
XML文件中的结果将是
<![CDATA[ ... ]]>
我怀疑要作为XML元素传递的文本是
<?xml version="1.0" ... v1_0.xsd"/>
现在,如果我必须手动将其写入XML文件,我将其写入&#34; CDATA部分&#34;,但是(JAXB)marshaller将把这三个字符视为我之前描述的那就是它。
<?xml version="1.0" ... v1_0.xsd"/>
尝试使任何XML编组器使用CDATA机制是没有意义的,并且没有&#34; CDATA值&#34;需要特殊处理 - 所以没有这种特殊待遇。