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

时间:2011-06-11 16:59:53

标签: 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);

现在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()

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

3 个答案:

答案 0 :(得分:10)

我猜您在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");

<xsl:output xalan:line-separator="&#10;" />

其中xalan是与“http://xml.apache.org/xalan”相关联的前缀。

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

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

答案 1 :(得分:1)

奇怪,但在创建变换器后立即尝试transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "no");,看看会发生什么。

答案 2 :(得分:0)

尝试使用Xalan 2.7.1进行测试的Xerces 2.9.0。 (2.9.0来自Xalan包)

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