为什么Apache 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()
) 为什么会这样呢?我该怎么做才能解决此问题?     

解决方法

        我猜您在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     ,        奇怪,但是尝试在创建变压器之后立即执行
transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT,\"no\");
,然后看看会发生什么。     ,        尝试使用经过Xalan 2.7.1测试的Xerces 2.9.0。 (2.9.0包含在Xalan软件包中) 在Xerces 2.11.0遇到问题后,我做了同样的事情。