2012-03-20 11 views
1

XMLファイル(存在する場合はファイルを作成しない場合)を読み込み、タグをいくつか変更してxmlを書き戻す必要があります。私はJava Dom4j SAXReaderとXMLWriterの結果が複数改行になる

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に切り替えると、改行はまったく書き込まれません。

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

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を使用します。

どうもありがとう Hauke

答えて

1

JavaでフォーマットされたXMLを書くための最良の方法は、このように、javax.xml.transformパッケージを使用しています。ところで

は、落とし穴の数は、あなたが提示したコードにあります。

​​

デフォルトのプラットフォームを使用して文字列#のGetBytesメソッド()を使用してきましたので、これは、異なるエンコーディングのために安全ではありません誤ったエンコードの見出しが付いたXML文書が簡単に生成される可能性があります。

XMLWriterは、com.sun実装固有のクラスであり、JDK全体で移植できません。 (それほど問題はありません)

+0

ありがとうございました。それははるかに良く働いています。しかし、正しく動作させるためには、2つのことを変更する必要がありました。 1)transfac.setAttribute( "indent-number"、new Integer(2)); - >私はそれを削除する必要があったため、私はIllegalArgumentExceptionを持っています:サポートされていません 2)trans.transform(新しいDocumentSource(document)、result); - > DomSourceオブジェクトは私のクラスパスにはありませんでしたが、DocumentSourceはありました。たぶん私は別のバージョンを使用しています。 ありがとうございました! – Hauke

関連する問題