1

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";
}

問題は、書き戻すたびに1つの追加の改行が作成されることです。outputFormatの引数をtrueからfalseに切り替えると、改行はまったく書き込まれません。

この問題を回避する簡単な方法はありますか?

どうもありがとうハウケ

4

1 に答える 1

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間で移植可能ではありません。(それはあなたにとって問題になる可能性は低いです)

于 2012-03-20T10:34:49.487 に答える