Java Dom4j SAXReader和XMLWriter会产生多个换行符

时间:2012-03-20 07:35:57

标签: java xml dom4j

我需要读取一个XML文件(如果存在 - 如果没有,那么我将创建该文件),修改一些标签并将xml写回。我这样做是为了

    InputStream in = new FileInputStream(userFile);
    SAXReader reader = new SAXReader();
    Document document = reader.read(in);

    Element root = document.getRootElement();
    ...

并用

回信
    FileUtils.writeByteArrayToFile(userFile, getFormatedXML(document).getBytes());

    ...

    private String getFormatedXML(Document doc) {
    try {
        String encoding = doc.getXMLEncoding();

        if (encoding == null)
            encoding = "UTF-8";

        Writer osw = new StringWriter();
        OutputFormat opf = new OutputFormat("  ", true, encoding);
        XMLWriter writer = new XMLWriter(osw, opf);
        writer.write(doc);
        writer.close();
        return osw.toString();
    } catch (IOException e) {
    }
    return "ERROR";
}

问题是,在每次回写后,将创建一个额外的换行符。如果我将outputFormat的参数从true切换为false,则根本不会写入换行符。

有解决这个问题的简单方法吗?

非常感谢 Hauke

1 个答案:

答案 0 :(得分:1)

在Java中编写格式化XML的最佳方法是使用javax.xml.transform包,如下所示:

 TransformerFactory transfac = TransformerFactory.newInstance();
 transfac.setAttribute("indent-number", 2);
 Transformer trans = transfac.newTransformer();
 trans.setOutputProperty(OutputKeys.INDENT, "yes");
 trans.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
 trans.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
 Result result = new StreamResult(System.out);
 trans.transform(new DomSource(document), result);

而不是System.out,请使用FileOutputStream作为目标文件。

顺便说一下,你提出的代码中有很多陷阱:

FileUtils.writeByteArrayToFile(userFile, getFormatedXML(document).getBytes());

这对于不同的编码是不安全的,因为您使用了String#getBytes(),它使用默认的平台编码,并且很容易导致带有错误编码标题的XML文档。

XMLWriter是一个com.sun特定于实现的类,它不能跨JDK移植。 (这不太可能成为你的问题)