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

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

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

最佳答案

我猜你是在 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

关于xml - 为什么 Apache Xerces/Xalan 向我的序列化输出添加额外的回车符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6317273/

相关文章:

xml - 协助在多个元素之间进行 XML XSD 选择

.NET XML 序列化助手类

.NET 二进制 XML

java xml,创建自闭标签

java - XML 目录解析/resolver.jar 与 com.sun.org.apache.xml.internal.resolver

c# - Node.SelectNodes(/*) 和 Node.childNodes 有什么区别?

Java:使用 DOM 和 unescapeHtml4() 生成 XML

c# - 将 xstream 生成的 xml 读入 .net

未找到 Java xerces DocumentBuilderFactoryimpl - 怎么办?

java - 使用 Jackson/FasterXML 读取 XML 时如何忽略某些元素?