Transformer CDATA_SECTION_ELEMENTS修改我的XML内容

时间:2018-06-10 22:12:36

标签: java xml jaxb transformation

我有这段代码:

Transformer transformer1 = TransformerFactory.newInstance().newTransformer();
final DOMResult domResult = new DOMResult();
marshaller.marshal(objectForMarshall, domResult);
transformer1.setOutputProperty(OutputKeys.INDENT, "yes");
transformer1.setOutputProperty(
        OutputKeys.CDATA_SECTION_ELEMENTS,
        "Parameters");
transformer1.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
transformer1.transform(new DOMSource(domResult.getNode()), new StreamResult(new FileOutputStream("D:\\1.xml")));

objectForMarshall中有一个数组类型为字节的字段。我希望将其内容放入CDATA部分。

我有这个适配器:

public class CDATAAdapter extends XmlAdapter<String, byte[]> {

    @Override
    public String marshal(byte[] v) throws Exception {
        return new String(v);
    }

    @Override
    public byte[] unmarshal(String v) throws Exception {
        return v.getBytes();
    }

} 

转换后,在最终文件中,我获取了CDATA中的内容,该内容由一个新行分隔:

<ConditionInstance ActionConditionComponent="Regular" Id="1026">
      <Parameters><![CDATA[<regular_condition>

  <union type="AND">

    <operation allow_absent_property="false" type="BIGGER">

      <left>

        <Entity item="value" property="DateTo" type="datetime"/>

      </left>

      <right>

        <Entity item="value" property="DateTo" type="datetime"/>

      </right>

    </operation>

  </union>

</regular_condition>

]]></Parameters>
    </ConditionInstance>

为什么会这样,我无法理解?如何解决这个问题?为什么变压器会改变我的内容?

如果我删除:

transformer1.setOutputProperty(
            OutputKeys.CDATA_SECTION_ELEMENTS,
            cDataTagName);

不添加新行!!!

<ConditionInstance ActionConditionComponent="Regular" Id="1026">
      <Parameters>&lt;regular_condition&gt;&#13;
  &lt;union type="AND"&gt;&#13;
    &lt;operation allow_absent_property="false" type="BIGGER"&gt;&#13;
      &lt;left&gt;&#13;
        &lt;Entity item="value" property="DateTo" type="datetime"/&gt;&#13;
      &lt;/left&gt;&#13;
      &lt;right&gt;&#13;
        &lt;Entity item="value" property="DateTo" type="datetime"/&gt;&#13;
      &lt;/right&gt;&#13;
    &lt;/operation&gt;&#13;
  &lt;/union&gt;&#13;
&lt;/regular_condition&gt;&#13;
</Parameters>
    </ConditionInstance>

1 个答案:

答案 0 :(得分:1)

我的猜测是,Parameters元素的值是一个包含CRLF(x13 x10)字符对的字符串。

直接序列化时,CR被序列化为字符引用&#13;,NL被序列化为实际换行符。

当您将其作为CDATA部分的一部分序列化时,CRLF被序列化为两个字符,x13后跟x10;无论你使用什么软件来显示输出,都会将其显示为两个换行而不是一个。