倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

出力フォーマットを指定する

今回は、Document オブジェクトをファイルなどに出力する際に、そのフォーマットを指定する org.dom4j.OutputFormat(以下、 OutputFormat)について見ていきます(一覧)。 OutputFormat は概ね org.dom4j.XMLWriter(以下、XMLWriter)と共に用います。

OutputFormat の使い方


OuputFormat を使う手順は

  1. OutputFormat オブジェクトを生成する
  2. そのOutputFormat オブジェクトを引数にして XMLWriter のインスタンス生成する
  3. XMLWriter を用いて Document オブジェクトを出力する

です。 これを踏まえて、サンプル・コードを見てみましょう:

import java.io.*;
import org.dom4j.Document;
import org.dom4j.io.*;

public class OutputFormatSample {
    
    public static void write(Document doc, String filename)throws IOException{
        // 1. OutputFormat のインスタンスを生成
        OutputFormat myFormat = new OutputFormat("\t", true, "SHIFT_JIS");
        XMLWriter xw = null;
        try{
            // 2. OutputFormat を引数にして XMLWriter のインスタンスを生成
            xw = new XMLWriter(new FileWriter(filename), myFormat);

            // 3. Document を書き出す
            xw.write(doc);
            xw.flush();
            
        }finally{
            if(xw != null)writer.close();
        }
    }
}

OutputFormat を引数にとる XMLWriter のコンストラクタは3つあります:

XMLWriter(OutputFormat)
XMLWriter(java.io.OutputStream, OutputFormat)
XMLWriter(java.io.Writer, OutputFormat)

OutputFormat のコンストラクタ


OutputFormat のコンストラクタは次の4つです:

public OutputFormat()
public OutputFormat(String indent)
public OutputFormat(String indent, boolean newlines)
public OutputFormat(String indent, boolean newlines, String encoding)

引数の役割は次の通り。 省略された場合のデフォルト値は、次節の「OutputFormat のプロパティ」の欄参照。

引数 識別子 説明
第0引数 indent String 行頭の字下げに用いる文字列を指定します。
第1引数 newlines boolean レイアウトのために新しい行を付加するかどうかを指定します。
第2引数 encoding String 出力のエンコーディングを指定します。

OutputFormat のプロパティ


OutputFormat で設定できるプロパティを見ていきましょう。
boolean 型のプロパティ

値の取得・設定用のメソッドは Java Beans の boolean 値プロパティに対する Accessor メソッドに対する命名規則と同じです。 すなわち、"someProp" というプロパティに対して

  • getter メソッド → isSomeProp()
  • setter メソッド → setSomeProp(boolean)

となります。

名前 デフォルト値 説明
expandEmptyElements false 空要素を展開するかどうか。
newLineAfterDeclaration true XML文書宣言の後に空白行を入れるかどうか。
newlines false レイアウトのために新しい行を付加するかどうか。
omitEncoding false エンコーディング宣言を省略するかどうか。
padText false 要素とテキストが並んでいる場合にスペースを1つ挿入するかどうか。
suppressDeclaration false XML 文書宣言を省略するかどうか。
trimText false テキストの空白文字を削るかどうか
xHTML false XHTMLかどうか。

boolean 以外の型のプロパティ

boolean 型でないプロパティに対する Accessor メソッドは、"someProp" というプロパティに対して

  • getter メソッド → getSomeProp()
  • setter メソッド → setSomeProp(..)

となります。

名前 デフォルト値 説明
AttributeQuoteCharacter char " 属性の値を囲む文字。 "、'以外をセットしようとすると例外を投げる。
encoding String UTF-8 出力のエンコーディング。
indent String null 字下げに用いる文字列。
lineSeparator String \n 改行文字。
newLineAfterNTags int 0 isNewLine が false のときいくつの要素ごとに改行するか。


また、indent の setter メソッドとして以下のものがあります:

  • setIndent(boolean):インデントするかどうかを設定する
  • setIndetSize(int):インデントの際に用いる文字列を、引数で指定される数の空白に設定する

既存のフォーマット


OutputFormat には、2つのフォーマット PrettyPrintCompactFormat が予め用意されています。 これらのインスタンスは OutputFormat の static メソッド、OutputFormat#createPrettyPrint() もしくは OutputFormat#createCompactFormat() によって取得できます。

使い方は普通の OutputFormat と同じです。 また、このインスタンスに対してエンコーディングやその他のプロパティを変更したりもできます。 それぞれのプロパティは次の表の通り。

プロパティ名 PrettyPrint CompactFormat OutputFormatのデフォルト値
newlines true false false
trimText true true false
indent 2 whitespaces null null


これ以外のプロパティは OutputFormat のデフォルト値と同じです。