我有这段代码:
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><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>
答案 0 :(得分:1)
我的猜测是,Parameters元素的值是一个包含CRLF(x13 x10)字符对的字符串。
直接序列化时,CR被序列化为字符引用
,NL被序列化为实际换行符。
当您将其作为CDATA部分的一部分序列化时,CRLF被序列化为两个字符,x13后跟x10;无论你使用什么软件来显示输出,都会将其显示为两个换行而不是一个。