2

今日、私は非常に興味深い問題に直面しました。xmlファイルを書き直そうとしたとき。

これを行うには3つの方法があります。そして、私は問題の最善の方法と理由を知りたいです。

私。

File file = new File(REAL_XML_PATH);
         try {
         FileWriter fileWriter = new FileWriter(file);
         XMLOutputter xmlOutput = new XMLOutputter();

     xmlOutput.output(document, System.out);
     xmlOutput.output(document, fileWriter);

     fileWriter.close();
     } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
     }

この場合、アプリに大きな問題があります。自分の言語でファイルを書き込んだ後、何も読めなくなりました。エンコーディングファイルがANSIで変更されましたjavax.servlet.ServletException: javax.servlet.jsp.JspException: Invalid argument looking up property: "document.rootElement.children[0].children"

II。

File file = new File(REAL_XML_PATH);
         XMLOutputter output=new XMLOutputter();
         try {
            output.output(document, new FileOutputStream(file));
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

この場合、問題はありません。エンコーディングは変更されていません。読み書きに問題はありません。

そしてこの記事http://tripoverit.blogspot.com/2007/04/javas-utf-8-and-unicode-writing-is.html

そして、私は問題の最善の方法と理由を知りたいです。

4

2 に答える 2

4

まあ、これは問題のように見えます:

FileWriter fileWriter = new FileWriter(file); 

それは常にプラットフォームのデフォルトエンコーディングを使用しますが、これはめったに必要なものではありません。デフォルトのエンコーディングがISO-8859-1であるとします。ドキュメントがUTF-8でエンコードされていると宣言しているが、実際にはすべてをISO-8859-1で記述している場合、ASCII以外の文字があると、ファイルは無効になります。 ISO-8859-1シングルバイト表現。これは有効なUTF-8ではありません。

XMLOutputter私は実際にはではなくにストリームを提供しますWriter。そうすれば、ファイルによって宣言されたエンコーディングとライターによって使用されたエンコーディングの間に競合の余地はありません。したがって、コードを次のように変更するだけです。

FileOutputStream fileOutput = new FileOutputStream(file);
...
xmlOutput.output(document, fileOutput);

...コードの2番目のビットで完了したことがわかります。そうです、これが推奨されるアプローチです。ここでは、ストリームはバイナリデータを処理するだけなので、使用するエンコーディングについては何も想定していません。XML記述コードは、そのバイナリデータが何であるかを決定し、実際に使用する文字エンコードがファイルの先頭の宣言と一致することを確認できます。

また、例外処理をクリーンアップする必要があります。スタックトレースを出力して失敗を続行するのではなく、ブロックの最後ではなくブロックを呼び出しcloseてください。例外を真に処理できない場合は、スタックに直接伝播させるか(メソッドに句を追加する可能性があります)、それをキャッチしてログに記録し、例外または原因をラップするより適切な例外を再スローします。finallytrythrows

于 2012-08-31T06:12:52.900 に答える
0

私の記憶が正しければ、xmlOutputterに次の「きれいな」形式を使用させることができます:new XMLOutputter(Format.getPrettyFormat())なので、私も機能するはずです

かなりです:

2スペースインデントで空白の美化を実行し、UTF-8エンコーディングを使用し、空の要素を展開せず、宣言とエンコーディングを含み、デフォルトのエンティティエスケープ戦略を使用する新しいFormatオブジェクトを返します。他のインスタンスに影響を与えることなく、返されたFormatインスタンスに微調整を加えることができます。

于 2012-08-31T06:16:52.107 に答える