連載 役に立つXMLツール集(1)
XMLをJavaにマップするデータバインディング

XMLプログラミングでは、DOMやSAXといったAPIを使用すると単調なコードを繰り返し書くことになり生産性が上がらないものだ。本連載では開発者が“楽をする”ために役立つXML関連ツールを紹介していく。(編集局)

www.netpotlet.com
原田洋子
2003/11/5

XMLとJavaの関係を整理しよう

主な内容
XMLとJavaの関係を整理しよう
XMLで表現するってどういうこと?
Javaを持ち込めると何がウレシイ?
データバインディングで何ができる?
データバインディングとは

 XMLを扱うにはJavaがあるけれど、ほかにも例えばC#のような言語で操作しているサンプルをよく見掛ける……。Javaでデータを扱うにはXMLという解決方法もあるけれど、昔ながらのプロパティというものがあるし、XMLを書きたくない……。

 XMLとJavaの関係は、このような状況にあるのではないでしょうか。これはXMLとJavaがお互いに補完し合う関係にあるものの、補完方法としてはどちらにとっても、数ある組み合わせの中の1つでしかないことが理由かもしれません。技術は適材適所が肝心ですから、何が何でも「ここでXML、ここはJavaしかない」ということはありません。いろいろな補完方法があるのは自然です。それでは、XMLとJavaがほかの組み合わせよりもすごくいい! のはどこなのでしょうか。

 XMLプログラミングに役立つツールを紹介する本連載では、手始めに最近注目されつつあるデータバインディングを取り上げます。データバインディングはJavaによる実装が充実している分野で、もちろんXMLとしても核となる技術です。

 今回はデータバインディングがどのようなもので、何ができるのかを見ていきます。次回以降は現在リリースされているJavaによるデータバインディングのうち、よく使われているものをいくつか取り上げていきます。また、各種データバインディングの比較や、より具体的な利用方法にも触れる予定です。

XMLで表現するってどういうこと?

 データバインディングとは、の話を始める前にXMLで何かを表現するというのはどのようなことかを確認しておきましょう。ディスプレイから目を離して、あたりを見回してみてください。きっといろいろなモノが散在していることでしょう。最も手近にあるのはキーボードでしょうか。ここでXMLを使うと、例えば次のように表現できるでしょう。

<キーボード本体>
  <キー 種類="制御" 色="暗め" 大きさ="中くらい">Shift</キー>
  <キー 種類="制御,文字" 色="明るめ" 大きさ="大きい">スペース</キー>
  <キー 種類="文字" 色="明るめ" 大きさ="小さい">Z</キー>
  <キー 種類="文字" 色="明るめ" 大きさ="小さい">X</キー>
   ……
   ……
</キーボード本体>

 あるいは属性を使わずに次のようにも表現できるでしょう。

<キーボード本体>
  <キー>
    <種類>制御</種類>
    <色>暗め</色>
    <大きさ>中くらい</大きさ>
    <名前>Shift</名前>
  </キー>
  ……
  ……
</キーボード本体>

 もう1つ身近な例として、きっと、一度は使ったことがあると思われるものを取り上げましょう。マイクロソフトの表計算ソフト、「Excel」です。Excelファイルを開いてみてください。すると、ブック(ファイル、ワークブック)があり、その中に1つ以上のシートがあります。そして、シートの中には1つ以上の行とやはり1つ以上の列という構造になっています。

 図1 Excelのデータ

 これをXMLで表現すると例えば次のようになるでしょう。

<workbook>
  <sheet>
    <row>
      <cell>東京</cell><cell>大阪</cell><cell>福岡</cell>
    </row>
    <row>
      <cell>55</cell><cell>77</cell><cell>66</cell>
    </row>
  </sheet>
  <sheet>
    <row>
      <cell>ジャイアンツ</cell><cell>タイガース</cell><cell>ホークス</cell>
    </row>
  </sheet>
</workbook>

 さて、手近なものをXMLで表現してみましたが、いったい何を行ったのでしょうか。そうです、XMLが得意とする構造の表現です。キーボードやExcelファイルを構造という視点でとらえ、表現したのが、上記のXMLです。これを、XMLモデルといいます。

Javaを持ち込めると何がウレシイ?

 データバインディングとは、の話を始める前にもう1つ、Javaを持ち込むと何がウレシイのかも考えてみましょう。

 キーボードをXMLでモデル化してみましたが、キーボードは飾りものではありませんので、「う〜ん、キーボードをこのような構造でとらえると美しいねぇ」と構造を表現しただけで終わっていては意味がありません。“Z”を押したら、Zという文字が入力されなければなりませんし、“スペース”を押したら、空白文字が入力されたり、仮名漢字変換が実行されなければなりません。

 ExcelをXMLで表現したものも同じです。素晴らしい構造を考え出し、その構造に従って、XMLで表現したからといって、それをExcelファイルとして人さまにお渡しできるわけではありません。XMLのworkbookタグは実際にExcelファイルに対応してくれないといけませんし、sheet、row、cellタグもそれぞれExcelの該当する場所と対応していなければいけません。

 そこで、Javaの登場です。XMLモデルをスタートに位置付けるなら、次は各要素や属性、あるいはその組み合わせを何かのアクションに対応させればいいはずです。XML文書のキーボード要素にはそのキーが押されたときに実行してほしい適当な処理を、Excelファイルを表現したXML文書のrowやcell要素には、Excelフォーマットのセルや行を生成するアクションを張り付ければいいはずです。そのために、Javaを使ってプログラミングします。

 Javaはオブジェクト指向言語ですから、すべてがオブジェクトで表現されます。Javaを持ち込むということは、今度はオブジェクトとしてモノをとらえることになります。これをオブジェクトモデルといいます。Javaでプログラミングするには、まず、オブジェクトモデルをどうするかを考えなければなりません。

データバインディングで何ができる?

 そして、ようやくデータバインディングの話になりました。XMLで表現したモノがJavaのプログラムで何かを実行してくれるようにするにはどうすればいいでしょうか。

 XML文書を上から順に見ていって、このタグが現れたら、このクラスのこのメソッドを実行して……とやりますか。確かにこれも1つの方法ですが、それではXMLモデルの構造は何のためにあるのでしょうか。人が見て理解しやすくするためですか。構造が変わってしまったら……あきらめて、最初からプログラムを作り直しますか。

 あるいは、構造をツリーにマップして、ツリーを探索しながら必要なクラスの適当なメソッドを実行していく方法もあるでしょう。これはいわゆるDOM(Document Object Model)と呼ばれる、XMLの代表的な方法です。しかし、DOMプログラミングはループと条件分岐でツリーを走査していくのが基本なので、やはり構造が変わってしまうとプログラムも変えなければなりません。

 そこで、XMLモデルとオブジェクトモデルという2種類のモデル間のマッピングを考えます。XML文書をJavaのクラスに対応させるのではなく、構造そのものをJavaのクラスにマッピングする方法です。オブジェクト指向言語にはクラス定義とインスタンスがありますが、XML文書にも同様の構造定義とインスタンスと呼ばれる文書の部分があります。構造定義をJavaのクラス定義にマッピングすれば、XML文書中の属性値や要素で囲まれた値はJavaでは該当するインスタンスの状態として維持できるようになります(図2参照)。このようなマッピングをうまくやってくれるのがデータバインディングです。

図2 XMLモデルとオブジェクトモデルのマッピング(クリックで拡大します)

 え? と思われた方がいるかもしれません。データバインディングといえば、XML文書構造の定義であるスキーマを入力すると、XML文書を操作するCやJavaなどのプログラムを自動生成してくれるツールと理解していた場合は特にそうでしょう。ですが、データバインディングを使う目的はプログラムの自動生成ではなく、自動生成されたAPIを使って何かを実行するプログラムを作るところにあります。データバインディングはXMLモデルからオブジェクトモデルへのマッピングが簡単にできてしまうAPIを自動生成するツールといえます。そして、データバインディングによって、プログラマが楽をするのも利用の目的です。

 データバインディングを使うと、APIを使ってのプログラミングになりますから、構造の変更はAPI側で吸収することも可能でしょう。複雑な部分もAPI内に隠ぺいされるので、より簡単にプログラミングできるようになります。JavaのAPIを自動生成するデータバインディングの場合、通常、XMLモデルからオブジェクトモデルへとその逆、オブジェクトからXMLへの相互変換ができるようになっています。つまり、Javaのオブジェクトとして操作した結果を再びXML文書に戻せるのです。

データバインディングとは

 最後に、データバインディングとは何かを説明します。XML文書構造の定義をスキーマといいます。キーボードの例では2種類のスキーマによるモデル化を試みたように、XMLモデルを表現するスキーマはただ1つとは限りません。

 では、どのようにして自分が考えたスキーマを表現しましょうか。言葉でいうと「キーボード要素はキー要素を複数持てる、キー要素には属性があり、これらは種類、色、要素で、その型は……」となるでしょう。しかし、このままではプログラムで処理できませんから、何かのシンタックスが決まっていないと困ります。定義を表現する道具、あるいは定義のためのシンタックスがスキーマ言語です。

 現在、スキーマ言語にはDTD(Document Type Definition)と、RELAXRELAX NGXML Schemaといったものがありますが、データバインディングが対象にしているのはRELAX/RELAX NG、XML Schemaです。DTDもサポート対象に含まれるデータバインディングもありますが、これは一般に、DTDからRELAXやXML Schemaへの変換を内部的に行っていたり、変換ツールが用意されています。また、スキーマがなくてもXML文書から自動的にスキーマを生成してくれるツールもあります。

 データバインディングはスキーマ言語を使って定義された構造から、その構造に従って記述されたXML文書をスキーマではない言語で操作するAPIを自動生成してくれるツールつまり、コンパイラです。このように説明すると、“スキーマコンパイラ”との違いが気になってきます。データバインディングとスキーマコンパイラは同じ意味で使われることがありますが、厳密には区別されます。データバインディングはモデルのマッピングのみを目的にしているツールであるのに対して、スキーマコンパイラは生成されたAPIを使って何をしたいのかも考慮し、用途別のAPIを自動生成するツールです。図2の例ではオブジェクトのツリー構造を作成できるAPIを生成するのみのデータバインディングに対して、ツリーを走査しながらアクションを実行できる枠組まで生成するのがスキーマコンパイラです。JAXBやCasterはデータバインディングに分類されますが、Relaxerはスキーマコンパイラです。また、JavaのAPIを生成するデータバインディングをJavaバインディングと呼んだ時代もありましたが、今は実装言語にかかわらず、“データバインディング”と呼ぶのが一般的です。

 最近はデータバインディングツールといってもモデルのマッピングのみではなく、データベースアクセス機能などを備える多機能ツールになってきました。

 次回以降、JAXBCastorRelaxerといったデータバインディングツールについて使い方を中心に見ていきます。お楽しみに。(次回に続く

関連記事

 ・SEのためのXML Schema入門
 ・XMLテクニック集
 ・Javaで実現するDOM/SAXプログラミング



「連載 役に立つXMLツール集」


XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間