与LF和CR LF的组合的XMLFormatter问题

时间:2017-11-24 11:56:46

标签: java xml xml-parsing xml-formatting

我使用dom4j Outpurformat和Document对象进行XML格式化。

如果Win -> \r\n and Linux -> \n

,我正在设置基于操作系统的lineseparator

如果我传递单行xml文件,它可以正常工作,获得预期的EOL(CR LF)。

但如果我传递多行xml文件,无论现有行(LF)是什么,都会附带新行(CR LF

ex: 输入文件:

    <root>
      <emp>
        <name>myname</name>
      </emp>
    </root>

输出:

    <root> LF
    CR LF
      <emp>LF
    CR LF
        <name>myname</name>LF
    CR LF
      </emp>LF
    CR LF
    </root>LF
    CR LF

我试图更换EOL仍然无法正常工作 我试过双向

xmlContent= xmlContent.replaceAll("\n","\r\n")
xmlContent = xmlContent.replaceAll("\\n","\r\n")

它在Linux中的工作正常如预期所有&#34; LF&#34;,但上面提到的问题是在Windows主机上。它结合了LF和CF LF。

2 个答案:

答案 0 :(得分:0)

字符串在java中是不可变的。因此必须替换换行符并分配给变量。

  • CR = \ r; - 回车
  • LF = \ n; - 换行
  • CRLF = \ r \ n - 行尾

    xmlContent = xmlContent.replaceAll(&#34; \ r \ n&#34;,&#34;&#34;)。repalceAll(&#34; \ n&#34;,&#34;&#34 ;)repalceAll(&#34; \ R&#34;&#34;&#34;);;

答案 1 :(得分:0)

在我看来,dom4j的行为是正确的。它只是在缩进输出时添加换行符(Windows操作系统的CR + LF)。额外的LF来自原始文件(我猜想使用unix约定)。 xml解析器将输入中的LF解释为文本节点,因此您也可以在输出中获取它们。 如果你尝试

怎么办?
xmlContent = xmlContent.replaceAll("\x0a","")

否则,您可以将xml阅读器配置为忽略空格

SAXReader xmlReader = new SAXReader();
xmlReader.setStripWhitespaceText(true);

但这也会影响元素内的空白区域。