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

为什么会这样?我能做些什么来解决这个问题?

4

3 回答 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

于 2012-09-05T09:37:27.517 回答
1

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

于 2011-06-11T17:30:13.057 回答
0

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

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

于 2012-06-11T14:28:35.480 回答