倭マン's BLOG

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

Java & XML

★メモリー上に展開しない API


以下の API はどちらも、XML 文書をメモリー上に展開しないので、軽快に動作します。
SAX (Simple API for XML)

いわゆる PUSH 型の読み取り API。 XMLReader または SAXParser によって読み取りを開始すると、出現した要素や属性などに対応して ContentHandler (もしくは LexicalHandler)のメソッドが呼び出されます。

関連パッケージは Java 標準 API に含まれています:

  • javax.xml.parsers
  • org.xml.sax
  • org.xml.sax.ext
  • org.xml.sax.helpers

StAX (Streaming API for XML)

いわゆる PULL 型の読み取り API。 XML 文書に対して XMLStreamReader もしくは XMLEventReader を生成し、その(Enumerator 様の)メソッドを呼び出すことによって、対象となっている XML 文書の要素や属性を取得します。

Java SE 6 以降標準 API になりました。 関連パッケージは

  • javax.xml.stream
  • javax.xml.stream.events
  • javax.xml.stream.util

XML 文書を Java オブジェクトとして扱う API


上記の API とは逆に、XML 文書をメモリー上に展開して、Java オブジェクトとして扱う API です。 最近は次節のように XML 文書を Java オブジェクトに変換して扱うことが主流になって、この節の API は影を潜めてる感がありますが(少なくとも日本語のサイトは検索に殆どかからない)、一応書いておきましょう。

DOM (Document Object Model)

Java だけでなく、いろいろなプログラミング言語で使用されることを念頭に置いて策定された API。 1つの言語で使い方を覚えれば他の言語でも基本的には使える反面、Java API とは少々趣が違う(特に要素の集合を使う際:NodeList)ので使いづらいと感じる Java プログラマーも。

関連パッケージは Java 標準 API に含まれています:

  • javax.xml.parsers
  • org.w3c.dom
  • org.w3c.dom.bootstrap
  • org.w3c.dom.events
  • org.w3c.dom.ls

JDOM

DOM とは逆に、Java に特化した API。 要素の集合を扱う際に、Java のコレクション・フレームワーク*1が使えます。 ただし、Generics には対応していません。 最新バージョンは1.0。

開発は2004年頃に止まっています。 XML 仕様に変更がない限り、新しいリリースはないようです。

dom4j

dom4j は JDOM の派生と言われています。 よって、dom4j でも Java のコレクション・フレームワークが使える様に設計されています。 また、XPath, StAX, JARV, JAXB などなど、いろいろな仕様をサポートしている高機能ライブラリ。 ただし、こちらでも Generics には対応していません*2。 最新バージョンは 1.6.1。

こちらも開発が2005年頃に止まっています。

XOM

XOM は XML 文書を出来るだけ忠実に Java のオブジェクト・モデルに落とし込んだ API です。 XML 文書で出来ないことは XOM API でも出来ません(例えば、タグ名に指定できない文字列を名前にセットしようとすると、例外が発生するそうです)。 XOM では、Java のコレクション・フレームワークは使用できません。 最新バージョンは1.1。

XML 文書を Java オブジェクトに変換して扱う API


前節では、XML 文書を表す Java オブジェクトを生成してそれを操作するというアプローチでした。 この節で紹介する API のアプローチは、

  1. まず Java オブジェクトを(開発者が)作成し、
  2. XML 文書からこのオブジェクトへの変換方法も指定(作成)して、
  3. プログラム中で XML 文書を読み込むと同時にこれを Java オブジェクトへ変換し、
  4. あとはこれを通常の Java オブジェクトとして扱うだけ、

というものです。 ここでは、Apache Commons Project で開発されている2つのプロダクトを列挙しておきます。

これらの使い方は、それぞれのサイト、もしくは『Jakarta Commonsクックブック ―Javaプロジェクト必須のレシピ集』を参照。

Java&XML 第2版

Java&XML 第2版


Jakarta Commonsクックブック ―Javaプロジェクト必須のレシピ集

Jakarta Commonsクックブック ―Javaプロジェクト必須のレシピ集

*1:java.util.List など。

*2:誰か dom5j って名前で、Generics に対応した dom4j 風のライブラリを開発してくれないかなぁ。