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

7
我正在使用 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);

现在myString包含了换行符(\r\n),实际上它是base64编码的数据,但是当我查看序列化输出时,会有额外的\r字符。 输入:
Line 1 \r\n
Line 2 \r\n
Line 3 \r\n

输出:

Line 1 \r\r\n
Line 2 \r\r\n
Line 3 \r\r\n

如果我使用createTextNode而不是createCDATASection,输出结果会变得更加有趣:
Line 1 
\r\n
Line 2 
\r\n
Line 3 
\r\n

额外的字符似乎是在序列化过程中引入的,DOM树似乎是正确的。(根据getTextContent())。
为什么会发生这种情况?我该怎么办才能解决这个问题?

"Result"只是一个输出树。你如何将Result序列化为字符串或输出流? - Jim Garrison
我遇到了同样的问题。你找到解决这个问题的方法了吗? - hd42
不好意思,我从来没有这样做过。我现在正在手动删除换行符。 - Daniel Rikowski
3个回答

11

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

transformer.setOutputProperty("{http://xml.apache.org/xalan}line-separator","\n");
或者
<xsl:output xalan:line-separator="&#10;" />

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


尝试生成Excel可以处理的CSV文件需要进行更改。单元格中的换行符为LF,而新行使用CRLF。 在互联网上没有找到这些信息,这让我很困扰。谢谢! - Bae

1

很奇怪,但是在创建转换器后立即执行transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "no");并查看发生了什么。


奇怪。创建“Result result =…”条目的代码是什么?您使用的是“Writer”还是“Stream”? - Femi

0

尝试使用已经与Xalan 2.7.1测试过的Xerces 2.9.0。(2.9.0包含在Xalan包中)

在我遇到Xerces 2.11.0问题后,我也做了同样的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接