【问题标题】:Why is Apache Xerces/Xalan adding additional carriage returns to my serialized output?为什么 Apache Xerces/Xalan 在我的序列化输出中添加额外的回车符?
【发布时间】:2011-06-11 16:59:52
【问题描述】:

我使用的是 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 序列化为字符串或输出流?
  • 我遇到了同样的问题。你找到解决这个问题的方法了吗?
  • 不,不幸的是我从来没有这样做过。我现在手动删除换行符。

标签: xml xml-serialization xerces xalan


【解决方案1】:

我猜你在 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。无法在互联网上的其他任何地方轻松找到此信息。
【解决方案2】:

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

【讨论】:

  • 奇数。创建Result result = .. 条目的代码是什么?您使用的是Writer 还是Stream
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 2015-09-22
    • 2016-07-16
    • 2019-04-11
    • 2020-11-25
    • 2015-01-09
    相关资源
    最近更新 更多