Java Dom4j SAXReader и XMLWriter приводят к нескольким переводам строки - PullRequest
1 голос
/ 20 марта 2012

Мне нужно прочитать файл 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 Ответ

1 голос
/ 20 марта 2012

Лучший способ написать отформатированный XML в Java - использовать пакеты 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.(Это менее вероятно, будет проблемой для вас)

...