倭マン's BLOG

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

XMLEventWriter

XMLEventWriter は XMLEvent を外部へ出力するクラスです。 XMLEventWriter の使用方法は以下のような手順で行います:

  1. XMLEventWriter のインスタンスを取得する
  2. XMLEventWriter のインスタンスを用いて XML イベントを書き出す
  3. XMLEventWriter をフラッシュする
  4. XMLEventWriter を閉じる

簡単なサンプルは次のようになります(第1引数の javax.xml.stream.XMLEventWriter オブジェクトから XML イベントを読み込み、それを第2引数の java.io.Writer オブジェクトへ書き出します):

public void outputEvents(XMLEventReader reader, Writer writer)
        throws XMLStreamException{
        
    XMLEventWriter eventWriter = null; 
    try{
        // 1. XMLStreamReader のインスタンスを取得する
        XMLOutputFactory factory = XMLOutputFactory.newInstance();
        eventWriter = factory.createXMLEventWriter(writer);
            
        while(reader.hasNext()){
            XMLEvent event = reader.nextEvent();
            
            // 2.  XML イベントを書き出す
            eventWriter.add(event);
        }

        // 3. XMLEventWriter をフラッシュする
        eventWriter.flush();
            
    }finally{
        // 4. XMLEventWriter を閉じる
        if(eventWriter != null)
            eventWriter.close();
    }
}

各ステップについて少し詳しく見ていきましょう。

XMLEventWriter のインスタンスを取得する


XMLEventWriter のインスタンスは、まず XMLOutputFactory のインスタンスを生成し、次いで XMLOutputFactory のメソッド XMLOutputFactory#createXMLEventWriter() によって生成します。

XMLOutputFactory factory = XMLOutputFactory.newInstance();
XMLEventWriter eventWriter = factory.createXMLEventWriter(writer);

簡単には、次のようにもできます:

XMLEventWriter eventWriter 
    = XMLOutputFactory.newInstance().createXMLEventWriter(writer);

createXMLEventWriter() メソッドに渡せるオブジェクトのうち、出力対象の XML 文書として指定できるものは次の3つです:

  • java.io.OutputStream
  • java.io.Writer
  • javax.xml.transform.Result

これらのオブジェクトに加えて、OutputStream の場合にはエンコーディングを指定する文字列も渡すことができます。

XML イベントを書き出す


イベントを書き出すには次の2つのメソッドを使います:

  • add(XMLEvent)
  • add(XMLEventReader)

add(XMLEventReader) メソッドは、引数の XMLEventReader から XMLEvent オブジェクトを列挙して add(XMLEvent) メソッドを呼び出すと思って良いでしょう。 add(XMLEvent) メソッドは、java.io.OutputStream や java.io.Writer から XMLEventWriter を生成した場合には、引数の XML イベントを通常のテキストの XML 文書(の断片)として書き出します。

XMLEventWriter をフラッシュする


java.io.OutputStream, java.io.Writer のように、XMLEventWriter でも書き出し後に flush() メソッドを呼び出す必要があります。

XMLEventWriter を閉じる


flush() メソッド同様、java.io.OutputStream, java.io.Writer のように XMLEventWriter も読み込みが終了した時点で関連するリソースを解放するために close() メソッドを呼び出す必要があります。 これらは例外が発生してもキチンと呼び出されるように、finally 節で呼び出しましょう。