Xindice:無料で使えるXMLデータベース(2)

JavaアプリケーションによるXMLデータベース検索


XMLの利用が広まるとともに、XMLデータベースに対する注目も集まりつつあります。本連載では、オープンソース・ソフトウェアとして公開されているXindiceを利用したネイティブXMLデータベースの実践を通して、XMLデータベースの利用方法を解説していきます。

野畠英明
ヒューレット・パッカード・ソリューションデリバリ(株)
2002/6/15



2-1. Javaプログラムによる検索の手順

 今回は、Javaのアプリケーション・プログラムからXindiceに格納されたデータをXPathで検索する方法を紹介します。まず、検索するためのAPIを紹介し、その次にサンプルアプリケーションを例に挙げながら実際の使い方を見ていきましょう。

検索用APIの使い方

 XindiceのAPIは、前回少し触れたように、XML:DB Initiativeという団体が推進しているXML:DBという標準仕様に基づいています。XindiceではXML:DBの実装を、JDBCにおけるドライバのような形で提供しています。Xindiceのパッケージのうち、パッケージorg.xmldb.api以下にあるインターフェイスやクラスはXML:DBに基づくもの、パッケージorg.apache.xindice以下にあるインターフェイスやクラスはXindice固有のものです。以上を踏まえて実際にどのように使うのか見ていきましょう。

 Xindiceの検索用APIは次のステップに従って利用します。

1. Database実装クラスの登録
2. コレクションの取得
3. XPathQueryServiceの取得
4. (ネームスペースの設定)
5. XPathで検索
6. ResourceSetから検索結果を取り出す
7. コレクションのクローズ

 4のネームスペースの設定は、ネームスペースを利用しない場合は省略可能です。また、例外XMLDBExceptionのハンドリングが必要となります。順番に詳しく見ていきましょう。

1. Database実装クラスの登録

 最初にDatabaseManagerクラスにDatabaseインターフェイスの実装クラスを登録します。これは、JDBCのDriverManagerクラスとDriverインターフェイスの実装クラスとの関係によく似ていて、XML:DBで決められた仕様に従ったドライバをXindiceが提供しているので、それを使うための準備といったところです。お決まりの手順と思ってもらえばよいでしょう。

String driver = "org.apache.xindice.client.xmldb.DatabaseImpl";
Class c = Class.forName(driver);

org.xmldb.api.base.Database database =
  (org.xmldb.api.base.Database)c.newInstance();
org.xmldb.api.DatabaseManager.registerDatabase(database);

2. コレクションの取得

 準備ができたら、次にコレクションを取得します。XML:DBはコレクションに対して操作するようにできていますので、コレクションを取得しないことには何も始まりません。ローカルにデータベースインスタンスがある場合、リモートにデータベースインスタンスがある場合の例を順に示します。

 ローカルにデータベースインスタンスがあって、かつポート番号がデフォルト(4080番)の場合は、次のようにしてコレクションを取得します。

org.xmldb.api.base.Collection col =   
  org.xmldb.api.DatabaseManager.getCollection(
  "xmldb:xindice:///データベースインスタンス名/コレクション");

 リモートにデータベースインスタンスがある場合は、次のように、そのホスト名とポート番号を明示してコレクションを取得します。

org.xmldb.api.base.Collection col =   
  org.xmldb.api.DatabaseManager.getCollection(
  "xmldb:xindice://ホスト名:ポート番号/データベースインスタンス名/
  コレクション");

3. XPathQueryServiceの取得

 コレクションに対して行いたいことに応じて、対応するサービスを取得します。今回は、XPathによる検索を行うので以下のようにXPathQueryServiceを取得します。

org.xmldb.api.modules.XPathQueryService service =
  (org.xmldb.api.modules.XPathQueryService);
col.getService("XPathQueryService", "1.0")

4. ネームスペースの設定

 ネームスペースを利用するドキュメントをXPathで検索する際、プレフィックスとURIとの対応関係をサービスに登録する必要があります。次のようにして対応関係を登録します。

String prefix = "p";
String uri = "http://somewhere/";
service.setNamespace(prefix, uri);

 また、登録したプリフィックスを削除するには、次のようにします。

String prefix = "p";
service.removeNamespace(prefix);

 登録されたすべてのプリフィックスを削除するには、次のようにします。

service.clearNamespaces();

5. XPathで検索

 コレクションから検索するには次のようにXPathQueryServiceに対しqueryメソッドを呼び出します。その戻り値としてResourceSet(JDBCでのResultSetに多少似ています)が返ってきます。

String xpath = "//person[fname='John']";
org.xmldb.api.base.ResourceSet resultSet =
   service.query(xpath);

 また、特定のドキュメントから検索するには次のようにドキュメントのIDを指定して検索します。

String id = "doc1";
String xpath = "//person[fname='John']";
org.xmldb.api.base.ResourceSet resultSet =
   service.queryResource(id, xpath);

 このIDは、前回の「ネイティブXMLデータベースを立ち上げる!」で、ドキュメントの登録に使った「xindiceadmin ad」コマンドのnオプションで指定したものです。

6. ResourceSetから検索結果を取り出す

 ResourceSetは、検索した結果(としてのResource)の集合が格納されているので、これから1つ1つのResourceを取り出して処理します。Resourceは、コレクションに登録されているXML文書などを示す抽象的なオブジェクトで、現在の仕様では、XMLResourceとBinaryResourceが定義されていますが(将来的にはこの2つ以外のResourceもあり得ます)、ここではXML文書に限って扱うこととし、BinaryResourceは扱いません。

// イテレータの取得
org.xmldb.api.base.ResourceIterator results = resultSet.getIterator();

// リソースがある間、繰り返す
while (results.hasMoreResources()) {

  // 次のリソースを取得
  org.xmldb.api.base.Resource res = results.nextResource();

  // ResourceがXMLResourceかどうかの確認
  if (res.getResourceType().equals("XMLResource")) {

    // 内容を文字列として表示
    System.out.println((String)res.getContent());

    // DOMのNodeとして内容を取得
    org.xmldb.api.modules.XMLResource xmlres =
      (org.xmldb.api.modules.XMLResource)res;
    org.w3c.dom.Node node = xmlres.getContentAsDOM();

    // nodeに対する処理を行う
    // ...
  }
}

 getContentAsDOMメソッドで得たNodeは、実際にはDocumentですので注意が必要です。要素を得るには、Nodeに対してgetFirstChildメソッドなどを呼び出す必要があります。

7. コレクションのクローズ

 コレクションに対する処理が終了したら、クローズして解放します。

col.close();

 いかがだったでしょうか。基本的には手順をなぞっていくだけで、XindiceからXML文書を取り出すことができるようになります。次項では、もう少し詳しい解説を交えて、実際のサンプルアプリケーションを紹介します。

3/9

Index
Xindice:無料で使えるXMLデータベース
  Xindiceをインストールする(Windows/UNIX)
・Javaで作られたXindice
・ネイティブXMLデータベースの特徴
・Xindiceの特徴
・Xindiceをインストールする
  XMLデータベースの作成と基本的な検索
・起動と停止
・コマンドラインからXindiceを利用する
・コレクションとドキュメント
・では、検索してみよう
・Xindiceの主なコマンド一覧
Javaプログラムによる検索の手順
・検索用APIの使い方
  検索サンプルアプリケーションの実際
・例外
・XPath
・Xindiceで検索するサンプルアプリケーション
・ネームスペースを利用しない例
・ネームスペースを利用する例
  サーブレットからXindiceを呼び出す
・サーブレット環境の準備
・Webアプリケーションの準備
  Xindiceを呼び出すサンプルサーブレット
・XPath式の結果をXML文書として返す
・結果をXSLTでHTMLに変換する
・変換のためのXSLTは別ファイル
  インデックスで高速化
・インデックス管理コマンド
・インデックスの有無によるスピード比較
・測定結果
  XUpdate言語の使い方
・現在ドラフト中のXUpdate
・ノードの挿入・追加
・ノードの更新
ノードの削除
・ノード名変更
  Javaアプリケーションから更新・削除を実行する
・更新用APIの使い方
・サンプルアプリケーション
・実行準備


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

注目のテーマ

HTML5+UX 記事ランキング

本日月間