为什么Apache Xerces/Xalan会为我的序列化输出添加额外的回车?

Dan*_*ski 7 xml xml-serialization xerces xalan

我正在使用Apache Xerces 2.11.0和Apache Xalan 2.7.1,我在序列化的XML中遇到了额外的回车字符问题.

我有这个(伪)代码:

String myString = ...;
Document doc = ...;

Element item = doc.createElement("item");
item.appendChild(doc.createCDATASection(myString));

Transformer transformer = ...;
ByteArrayOutputStream stream = new ByteArrayOutputStream();
Result result = new StreamResult(stream);
transformer.transform(new DOMSource(document), result);
Run Code Online (Sandbox Code Playgroud)

现在myString包含换行符(\r\n),(实际上它是base64编码数据)但是当我查看序列化输出时,还有其他\r字符.

输入:

Line 1 \r\n
Line 2 \r\n
Line 3 \r\n
Run Code Online (Sandbox Code Playgroud)

输出:

Line 1 \r\r\n
Line 2 \r\r\n
Line 3 \r\r\n
Run Code Online (Sandbox Code Playgroud)

如果我使用createTextNode而不是createCDATASection输出变得更有趣:

Line 1 
\r\n
Line 2 
\r\n
Line 3 
\r\n
Run Code Online (Sandbox Code Playgroud)

似乎在序列化期间引入了附加字符,DOM树似乎是正确的.(根据getTextContent())

为什么会这样?我该怎么做才能解决这个问题?

Ale*_*tis 11

我想你在Windows上遇到这个问题,而不是在Linux/Solaris/Mac上.Xalan序列化程序(org.apache.xml.serializer.ToStream.java)使用System.getProperty("line.separator")获取行分隔符.当串行器写入\ r \n时,它将\n解释为行序列的结尾,它实际上写入\ r + lineSeparator =\r \n \n \n \n.虽然这听起来很奇怪,但这不是一个错误,见[1].但由于这经常被报告为bug,因此添加了xalan扩展属性[2].所以你可以编程设置:

transformer.setOutputProperty("{http://xml.apache.org/xalan}line-separator","\n");
Run Code Online (Sandbox Code Playgroud)

要么

<xsl:output xalan:line-separator="&#10;" />
Run Code Online (Sandbox Code Playgroud)

其中xalan是与URL" http://xml.apache.org/xalan " 关联的前缀.

[1] https://issues.apache.org/jira/browse/XALANJ-1660

[2] https://issues.apache.org/jira/browse/XALANJ-2093