问题描述
|
我正在使用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=\" \" />
其中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遇到问题后,我做了同样的事情。