連載 役に立つXMLツール集(4)
Relaxerでデータバインディングに挑戦しよう
www.netpotlet.com
原田洋子
2004/2/4
主な内容 Relaxerの概要 Relaxerの入手とセットアップ 開発手順 スキーマの作成 スキーマのコンパイル 読み込みアプリケーションの作成 読み込みアプリケーションの実行 文書操作アプリケーションの作成 文書操作アプリケーションの実行 まとめ&サンプル・ダウンロード |
スキーマをコンパイルしてAPIが生成されたので、今度は簡単なアプリケーションを試してみます。ここでもこれまでのJAXB、Castorと比較しやすいようにXML文書を読み込むプログラムを同様のスタイルで作ってみます。スキーマをコンパイルするオプションによっては、アプリケーションのコンパイル時にRelaxerOrg.jarなどRelaxer付属のアーカイブが必要になりますが、通常はそのようなアーカイブを使いません。スキーマから自動生成されたAPIだけでアプリケーションを作れます。
リスト5がXML文書を読み込むRelaxerReaderクラスです。JAXBやCastorはXML文書の読み込みをアンマーシャル(Unmarshal)といい、unmarshalメソッドを使いましたが、Relaxerは独自の名前を持つメソッドで読み込みます。また、RelaxerはXML文書のルート要素に当たるクラスをインスタンス化するという方法で読み込みを行います。コンストラクタの引数にはファイルやURLだけではなく、ストリームやDOMオブジェクトも指定できます。アンマーシャルにこだわりたい場合はjava.jaxbオプションを指定してスキーマをコンパイルするといいでしょう。JAXB APIが使えるようになるので、アンマーシャルもできるようになります。
リスト5はパッケージcom.netpotlet.testに属するクラスとして定義しましたので、次のようにしてパッケージ/クラスを作ります。
パッケージ・エクスプローラーでソース・フォルダー(src)選択 →
右クリック → 新規 → パッケージ →
パッケージ名(com.netpotlet.test) → 終了
パッケージ・エクスプローラーでパッケージ(com.netpotlet.test)選択 →
右クリック → 新規 → クラス → クラス名(RelaxerReader) → 終了
1 package com.netpotlet.test; |
リスト5 RelaxerReader.java |
XML文書の読み込みを行うアプリケーションを実行してみましょう。このアプリケーションはXML文書を実行時の引数から取得するので、次のように設定、実行します(図5、6参照)。なお、XML文書は図4のdocsディレクトリに置いてあります。
実行 → 実行... → Javaアプリケーション → 新規 → メインタブ →
プロジェクト名(gulf)/メイン・クラス(com.netpotlet.test.RelaxerReader)
→ 引き数タブ → プログラム引き数(docs/keyboard1.xml) →
適用 → 実行
図4 gulfプロジェクトのディレクトリ構成(クリックで拡大します) |
図5 実行アプリケーションの設定(クリックで拡大します) |
図6 実行時の引数指定(クリックで拡大します) |
XML文書が正しく書けていれば図7のように出力されます。
図7 RelaxerReaderの実行結果(クリックで拡大します) |
JAXBとCastorで試したのと同様に、要素や属性を追加してXML文書を出力するアプリケーションも試してみましょう。リスト6 RelaxerCreatorがそのためのクラスです。
標準ではRelaxerはXML文書を出力するときにCastorやJAXBのようにマーシャル(Marshal)のためのmarshalメソッドを使いません。代わりに、リスト6の27行目で実行しているように、XML文書のルート要素に当たるクラスのmakeTextDocument()メソッドを実行します。読み込みと同様、java.jaxbオプションを付けてスキーマをコンパイルすれば、JAXB APIを利用できるので、マーシャルによる出力も可能です。
1 package com.netpotlet.test; |
リスト6 RelaxerCreator.java |
JAXPを利用した出力の整形
RelaxerはCastor同様、特に何かをしない限り、出力するXML文書のインデントを行いません。これは前回のCastorでも説明しましたが、改行やインデントはXML的には
終了タグ、改行、スペース、スペース、スペース、スペース、開始タグ
のようになるため、XML文書のサイズが大きくなるほどに改行やインデントが占める容量を無視できなくなることが理由でした。また、Canonical XML準拠という理由でもあります。JAXBやCastorには整形のための方法がありましたが、Relaxerには特に用意されていないので、ほかのAPIを利用します。最初に、JAXP(Java API for XML Processing ― DOM/SAXのAPI)による整形方法を紹介します。
JAXPを利用して出力するにはXSLTによる変換を目的としている、javax.xml.transformパッケージを使います。例えば、リスト7のような変換のためのクラスJaxpMarshallerを用意し、リスト6 RelaxerCreatorクラスにimport文を2つ、コンストラクタにスローする例外を2つ、marshalメソッドを実行する行を1つ追加します。このようにすると、出力が改行されます。
6 import javax.xml.parsers.ParserConfigurationException; |
RelaxerCreator.javaの変更点 |
1 package com.netpotlet.test; |
リスト7 JaxpMarshaller.java |
JAXBの利用
JAXPを利用する方法は仮のマーシャラーとmarshalメソッドを用意しただけなので、JAXB APIを使って本物のマーシャルも試してみます。JAXB APIを利用する場合、java.jaxbオプションを指定してスキーマをコンパイルします。Relaxer EclipseプラグインではRelaxer.propertiesの「XML1」でjava.jaxbをtrueに指定します(図8)。Antでビルドする場合はリスト4 build.xmlの18行目の次に「-java.jaxb」オプションを追加します。
17 <arg line="-validation:relax
-java.package:com. |
build.xmlの変更点 |
図8 java.jaxbオプションの指定 |
java.jaxbオプションを指定するときは、RelaxerとJAXBのAPIも必要になるので、次のようにRelaxerのRelaxerOrg.jarとJAXBのjaxb-api.jarをJavaプロジェクトのビルド・パスに追加します。
パッケージ・エクスプローラーでプロジェクト(gulf)選択 → 右クリック →
プロパティー → Javaのビルド・パス(左ペイン) → ライブラリー選択 →
外部JARの追加
→ RelaxerOrg.jar/jaxb-api.jar アーカイブを追加する(画面)
以上の準備をした後にビルドすると、表1のクラス、インターフェイスに加わえて、IKeyboardFactory.java、AbstractKeyboardFactory.java、DefaultKeyboardFactory.java、KeyboardFactory.javaの4つが生成されます。ここで、例えば、リスト8のようなJAXB APIによるマーシャルのクラスJaxbMarshallerを用意し、RelaxerCreatorにimport文を1つ、コンストラクタにスローする例外を1つ、marshalメソッドを実行する行を1つ追加します。これは、第2回のリスト6で紹介したマーシャル方法と同じです。
ここでは出力をインデントする目的でJAXB APIを利用しましたが、JAXBにしかない機能を使いたい場合には、リスト8のgetContext()メソッドで行っているようにjavax.xml.bind.JAXBContext型のオブジェクトを取得すれば、JAXBも使えるようになります。
6 import javax.xml.bind.JAXBException; |
RelaxerCreator.javaの変更点 |
1 package com.netpotlet.test; |
リスト8 JaxbMarshaller.java |
■文書操作アプリケーションの実行
アプリケーションを作りましたので実行してみましょう。今度もXML文書を実行時の引数から取得するので、次のように設定、実行します。XML文書は図4のdocsディレクトリに置いてあります。
実行 → 実行... → Javaアプリケーション → 新規 → メインタブ →
プロジェクト名(gulf)/メイン・クラス(com.netpotlet.test.RelaxerCreator)
→ 引き数タブ →
プログラム引き数(docs/keyboard2.xml) → 適用 → 実行
問題なく実行されれば、図9(JAXP)、図10(JAXB)のように出力されます。
図9 RelaxerCreatorの実行結果(JAXPによるインデント) |
図10 RelaxerCreatorの実行結果(JAXBによるインデント) |
■まとめ&サンプル・ダウンロード
今回は日本発のデータバインディングツールRelaxerを取り上げましたがいかがだったでしょうか。Castor同様、JAXBという標準仕様に直接対応していないものの、要素がクラスにマップされたものをインスタンス化できるので、分かりやすいのではないかと思います。また、Relaxer Eclipseプラグインもとても使いやすく、便利なので、楽に開発を進められます。ただし、まだできたてのツールなのでヘルプが実装されていなかったり、プラットフォームによっては不具合があるかもしれません。
Relaxerは多機能と説明しましたが、これはプラグインのプロパティの画面を見ると一目瞭然でしょう。数々のオプションの中にはデザインパターンを構成するクラスを自動生成するもの、データベース利用機能に関係するものまであります。Relaxerは単なるデータバインディングツールではなく、スキーマコンパイラと呼べるツールになっているのではないかと思います。
ドキュメントについてはやや不足している感じですが、1.0リリース版には詳細なドキュメントが付属しているのでRelaxerの使い方についてこれを参照するといいでしょう(今回のテストに使った1.1 beta版には付属していません)。また、日本語のメーリングリストは作者の浅海氏も購読していますので、バグや不具合の報告で英語に悩まされることはありません。
最後に、Relaxerの日本語による主な資料を紹介します。
- 書籍
『Relaxer Java/XMLによるWeb開発』
浅海 智晴 著
株式会社ピアソン・エデュケーション ISBN4-89471-527-9
- RELAX利用者日本語メーリングリスト
http://www2.xml.gr.jp/1ml_main.html?MLID=relax-users-j
- 参考資料の一覧
http://www.netpotlet.com/technotes/PoiByRelax/references.ja.html
今回使用したプログラムやファイル類は以下からダウンロードできます。
- gulf.zip(プラグイン利用、154Kbytes)
- gulf-ant.zip(Antによるビルド、149Kbytes)
Windows環境で利用される場合、euc-jpをWindows-31Jなど適当なエンコーディングに変更してください。また、日本語を含むファイルはEUC-JPになっていますので、あらかじめ文字コードを変えてから利用されるといいでしょう。
◇
次回はデータバインディングツールが提供するO/Rマッピング機能を取り上げる予定です。(次回に続く)
======== my confessions ======== 前回のCastorの記事について……「2003年12月時点で最新版は0.9.5.2ですが、このバージョンはW3C XML SchemaからJavaのソースコードを生成するSourceGeneratorがうまく動かなかったため、本記事では1つ前のバージョンである0.9.5.1をftp://ftp.exolab.org/pub/castor/から取得して使いました。」 と書いたくだりについて、前回の記事で紹介した書籍『Javaオープンソース徹底攻略』の執筆者である吉田さんからコメントがありました。 http://yoshi.homelinux.org/~yoshi/?date=20040108#p01 この方法を試したところ、確かにコードは生成されたのですが、XML文書をネームスペースを使って書いていなかった(手抜き (^^; )ため、実行できませんでした。次のバージョンではフィックスされるそうですので、待つことにした次第です。 |
前編 開発環境の準備 | 2/2 |
Index | |
連載 役に立つXMLツール集(4) Relaxerでデータバインディングに挑戦しよう |
|
前編 開発環境の準備 |
|
後編 アプリケーションの作成 |
■関連記事
・SEのためのXML
Schema入門
・XMLテクニック集
・Javaで実現するDOM/SAXプログラミング
「連載 役に立つXMLツール集」 |
- QAフレームワーク:仕様ガイドラインが勧告に昇格 (2005/10/21)
データベースの急速なXML対応に後押しされてか、9月に入って「XQuery」や「XPath」に関係したドラフトが一気に11本も更新された - XML勧告を記述するXMLspecとは何か (2005/10/12)
「XML 1.0勧告」はXMLspec DTDで記述され、XSLTによって生成されている。これはXMLが本当に役立っている具体的な証である - 文字符号化方式にまつわるジレンマ (2005/9/13)
文字符号化方式(UTF-8、シフトJISなど)を自動検出するには、ニワトリと卵の関係にあるジレンマを解消する仕組みが必要となる - XMLキー管理仕様(XKMS 2.0)が勧告に昇格 (2005/8/16)
セキュリティ関連のXML仕様に進展あり。また、日本発の新しいXMLソフトウェアアーキテクチャ「xfy technology」の詳細も紹介する
|
|