倭マン's BLOG

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

dom4j を使おう!

前回チラッと紹介した dom4j の使い方を、何回かに渡って簡単に御紹介(一覧)。 

dom4j って必要?


前回にも書きましたが、最近は dom4j のような「XML 文書をモデル化した Java オブジェクト」を用いるよりも、「XML 文書を Java オブジェクト(特に Java Bean オブジェクト)に変換」して使う方が主流になってきている気がします。

ただし、これには Java オブジェクトを自作する必要がある分、ちょっとだけ閾が高い気がします(探せば XML 文書から Java Bean クラスのコードを自動生成するようなライブラリも普通に転がってそうですが)。 なので、1つの選択肢としてXML 文書をモデル化した Java オブジェクト」も扱えるようになっておくと良いかと思います。

DOM との関係は?


dom4jAPI は、基本的な思想としては「DOM と同じ」です。 XML 文書全体をメモリ上に展開して任意のノードに好きなようにアクセスできる API を提供します。 これは、アクセスできるノードの順番が決まっている SAX や StAX と対照的です。

一方、「DOM との違い」はというと、まず Java のコレクション・フレームワークjava.util.List など)をサポートしている*1点でしょう。 これによって、Java プログラマにとっては DOM よりも扱いやすい API になっていると思います。 その他、「org.dom4j.Document オブジェクト(XML 文書を表すクラス)を簡単に生成」できたり、「XPath 式を使って簡単にノードを取得」出来たりするのも魅力の1つです。

ちなみに、org.dom4j.Document オブジェクトから org.w3c.dom.Document オブジェクトへ変換したり、その逆変換をしたりするのも大した労力ナシに行えます。

JDOM との関係は?


一応、dom4j は JDOM の派生なので、基本的なコンセプトは似通ったところもあれば、意識して変更している所もあります。 以下に dom4j と JDOM の同じ所、違うところを列挙しておきます:

XML 文書をメモリ上に展開
どちらも DOM と同じように XML 文書をメモリ上に展開するので、任意のノードに好きなようにアクセスできます。
Java のコレクション・フレームワークをサポート
どちらも DOM とは違って、Java のコレクション・フレームワークをサポートしています。 ただし、どちらも Generics には対応していません。
×class ベースか interface ベースか
JDOM は class ベースなので、「new」キーワードでインスタンスを生成できますが、dom4j は interface ベースなので Factory クラスもしくは Utility クラスによってインスタンスを生成します(とはいっても、通常どちらもファイル等からオブジェクトを読み込むので、あまり気にする必要はありませんが)。
×API が簡潔か他の仕様を豊富にサポートしているか
JDOM は基本的に XML の仕様をサポートしているだけなのに対して、dom4j はその他の周辺仕様 (StAX, JAXB, JARV e.t.c.) も API の中に取り込んでいます。

今後の予定


今後の紹介内容の予定は

  1. org.dom4j.Document オブジェクトを生成する
  2. org.dom4j.Node オブジェクトの使い方
  3. XPath を使う
  4. org.dom4j.Document オブジェクトを出力する
  5. Maven2 プロジェクト内で dom4j を使う

です。

*1:Generics には対応していません。 実質的に開発が止まっているので、今後サポートされるかどうかも期待できません・・・