倭マン's BLOG

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

Document を出力する

今回は、第2回に対して Document オブジェクトを XML ファイルや org.w3c.dom.Document オブジェクトなどに変換する方法を見ていきましょう(一覧)。 これらを行うクラスは、Document オブジェクトを生成するクラス同様、org.dom4j.io パッケージ内にあります。


以下で、サンプル・コードを見ていきましょう。 その前にサンプルに対する注意を挙げておきます:

  • import 文や例外処理は省略もしくは簡略化してます
  • サンプル内の変換対象の Document オブジェクトは、メソッドに渡されている引数です
  • 同様の方法が、Document オブジェクトだけでなく Element 要素などの文書の断片にも適用出来る場合があります

♪Document オブジェクト → java.lang.String♪


これには、org.dom4j.Node インターフェースに定義されているメソッド Node#asXML() を用います:

public String toString(Document doc){
    return doc.asXML();
}

このメソッドはデバッグ時などに役立ちます。

♪Document オブジェクト → XML ファイル♪


Document を XML ファイルに出力するには org.dom4j.io.XMLWriter を使います。 以下のサンプルでは、ファイル名が "sample.xml" である XML ファイルに出力しています:

public void toXmlFile(Document doc)
        throws IOException{
 
    XMLWriter xw = new XMLWriter(new FileWriter("sample.xml"));
    try{
        xw.write(doc);
        xw.flush();
    }finally{
        xw.close();
    }
}

幾つかの注意を。

  • 書き出し後は XMLWriter#flush(), XMLWriter#close() を呼び出して下さい。
  • XMLWriter が出力する対象は、java.io.Writer もしくは java.io.OutputStream のどちらかです。 これはコンストラクタに渡すか、XMLWriter#setWriter(Writer), XMLWriter#setOutputStream(OutputStream) メソッドによってセットします。
  • 出力する XML 文書のフォーマット(改行するか、インデントするかなど)は org.dom4j.io.OutputFormat を使えばできます。 OutputFormat の使い方は次回以降に。
  • HTMLWriter も基本的な使い方は同じです(HTMLWriter は XMLWriter のサブクラス)。

♪Document オブジェクト → javax.xml.transform.Result♪


JAXP (Java API for XML Processing) を用いた XML オブジェクトの型変換です。 Document オブジェクトを Transformer によって XSL 変換し、その結果を javax.xml.transform.Result に出力します。 使用するクラスは org.dom4j.io.DocumentSource です:

public void toResult(
        Document doc,
        javax.xml.transform.Transformer t, 
        javax.xml.transform.Result result)
        throws TransformerException{
 
    final Source result = new DocumentSource(doc);
    t.transform(src, result);
}

♪Document オブジェクト → SAX イベント♪


Document オブジェクトから SAX イベントを生成します。 生成した SAX イベントは 指定した org.xml.sax.ContentHandler の各種メソッドを呼び出します。 この変換には org.dom4j.io.SAXWriter を使います:

public void toSaxEvent(
        Document doc,
        org.xml.sax.ContentHandler ch)
        throws org.xml.sax.SAXException{
 
    SAXWriter sw = new SAXWriter(ch);
    sw.write(doc);
}

CDATA、コメント、DTD、Entity に対して何らかの処理を行いたい場合は、org.xml.sax.ext.LexicalHandler を実装して、SAXWriter の引数に(ContentHandler と一緒に)そのインスタンスを渡して下さい。

♪Document オブジェクト → StAX イベント♪


dom4j に定義されている XML ノード(Node オブジェクト)を、指定した Writer に内容を書き出します。 これには org.dom4j.io.STAXEventWriter を使います:

public void toStaxEvent(
        Document doc,
        java.io.Writer writer)
        throws javax.xml.stream.XMLStreamException{

    STAXEventWriter sew = new STAXEventWriter(writer);
    sew.writeDocument(doc);
}

出力先は java.io.Writer 以外にも指定できます。 STAXEventWriter のインスタンス生成時にコンストラクタに以下のいずれかのインスタンスを渡してください:

  • java.io.File
  • java.io.OutputStream
  • java.io.Writer
  • javax.xml.stream.util.XMLEventConsumer

♪Document オブジェクト → org.w3c.dom.Document♪


Document オブジェクトを org.w3c.dom.Document オブジェクトに変換するには、org.dom4j.io.DOMWriter を使います:

public static org.w3c.dom.Document toDomDocument(
        Document doc)throws DocumentException{
 
    DOMWriter dw = new DOMWriter();
    dw.write(doc);
}