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

XMLデータの更新と削除



4-2. Javaアプリケーションから更新・削除を実行する

更新用APIの使い方

 第2回「JavaアプリケーションによるXMLデータベース検索」では、検索用APIの使い方を紹介しました。今回は、更新用APIの使い方を、検索用APIとの違いを説明する形で進めていきます。

 検索用APIは、次のステップで利用しました。

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

 一方、更新用APIは、次のステップで利用します。

1. Database実装クラスの登録
2. コレクションの取得
3. XUpdateQueryServiceの取得
4. (ネームスペースの設定)
5. XUpdateで更新
6. コレクションのクローズ

 3から5までが検索用APIとの違いです。以降でそれらのステップの説明を行います。

XUpdateQueryServiceの取得

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

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

ネームスペースの設定

 XML:DBでは定義されていないのですが、Xindiceでは、XUpdateでネームスペースを利用するため、プリフィックスとURIとの対応関係をサービスに登録する必要があります。次のようにして対応関係を登録します。

org.apache.xindice.client.xmldb.services.XUpdateQueryServiceImpl serviceImpl =
     (org.apache.xindice.client.xmldb.services.XUpdateQueryServiceImpl
)service;
String prefix = "p";
String uri = "http://somewhere/";
serviceImpl.setNamespace(prefix, uri);

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

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

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

serviceImpl.clearNamespaces();

XUpdateで更新

 コレクションから検索するには次のようにXUpdateQueryServiceに対しupdateメソッドを呼び出します。その戻り値として更新されたノードの数が返ってきます。

String xupdate = "<xupdate:modifications version=\"1.0\" "
+ "xmlns:xupdate=\"http://www.xmldb.org/xupdate\">"
+ "<xupdate:update select=\"problem[@id='ID0002']/@status\">closed</xupdate:update>"
+ "</xupdate:modifications>";
long num = service.update(xupdate);

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

String id = "doc1";
String xupdate = "";
long num = service.updateResource(id, xupdate);

 このIDは、第1回のドキュメントの登録に使った「xindiceadmin ad」コマンドのnオプションで指定したものです。

サンプルアプリケーション

 XindiceのコマンドにはXUpdateを実行するものがありませんので、そういうコマンドをサンプルとして作ってみましょう。このコマンドはパラメータとしてXUpdateを記述したファイル名を与えると、そのファイルから読んだXUpdateを実行します。

 このサンプルで扱うファイルは、分かりやすくするため、普通のXMLファイルとは違い、XMLのencodingの指定に従いません。JVMのデフォルトエンコーディングで読み込まれます。そこだけは注意してください。

実行準備

 サンプルアプリケーションをコンパイル・実行するためには、第2回で示した以下のクラスパスを設定しておく必要があります。

編注:以下のリストでは、入力するコマンドが分かりやすいようにエンターキーを押下する位置に記号を記しました。

Windows
C:\> set XINDICE_LIB=%XINDICE_HOME%\java\lib
C:\> set CLASSPATH=.;%XINDICE_LIB%\xmldb.jar;% XINDICE_LIB%\xindice.jar;%XINDICE_LIB%\openorb-1.2.0.jar;%XINDICE_LIB%\xerces-1.4.3.jar;%XINDICE_LIB%\xalan-2.0.1.jar
UNIX系(Bシェルでの操作)
$ XINDICE_LIB=$XINDICE_HOME/java/lib
$ export CLASSPATH=.:$XINDICE_LIB/xmldb.jar:$XINDICE_LIB/xindice.jar:
$XINDICE_LIB/openorb-1.2.0.jar:$XINDICE_LIB/xerces-1.4.3.jar:$XINDICE_LIB/xalan-2.0.1.jar

 加えて、Xindice 1.0でJava2 SDK 1.4を使う場合は、SDK付属のXalanを使わないようにするため、追加の設定が必要です(XUpdateでXalanを使うため)。1.3をご使用の方は読み飛ばしてください。

Windows
C:\> cd %XINDICE_HOME%\java\lib
C:\> mkdir endorsed
C:\> copy xerces-1.4.3.jar endorsed
C:\> copy xalan-2.0.1.jar endorsed
UNIX系(Bシェルでの操作)
$ cd $XINDICE_HOME/java/lib
$ mkdir endorsed
$ cp xerces-1.4.3.jar endorsed
$ cp xalan-2.0.1.jar endorsed

 以上の準備をしたうえで、実行時に、javaコマンドに次のようなオプションを付けてください。

Windows
C:\> java -Djava.endorsed.dirs=%XINDICE_HOME%\java\lib\endorsed クラス名
UNIX系(Bシェルでの操作)
$ java -Djava.endorsed.dirs=$XINDICE_HOME/java/lib/endorsed クラス名

 上記のオプションは、Xindiceの起動でも同様に必要ですので、Windowsであれば「%XINDICE_HOME%\startup.bat」、UNIX系であれば「$XINDICE_HOME/config/vm.cfg」(このファイルはJVMに与えるオプションを記述するものです)を書き換えてください。

サンプルコード

 XUpdateを実行するサンプルアプリケーションを紹介します。

XUpdate.java
import org.xmldb.api.base.*;
import org.xmldb.api.modules.*;
import org.xmldb.api.*;
import org.w3c.dom.*;
import java.io.*;

public class XUpdate {
  public static void main(String[] args) throws Exception {
    if (args.length != 1) {
      System.err.println("java XUpdate [ファイル名]");
      return;
    }
    String filename = args[0];

    Collection col = null;
    try {
      // 1. Database実装クラスの登録
      String driver = "org.apache.xindice.client.xmldb.DatabaseImpl";
      Class c = Class.forName(driver);
      Database database = (Database) c.newInstance();
      DatabaseManager.registerDatabase(database);

      // 2. コレクションの取得
      col = DatabaseManager.getCollection("xmldb:xindice:///db/sampledb");

      // 3. XUpdateQueryServiceの取得
      org.xmldb.api.modules.XUpdateQueryService service = (org.xmldb.api.modules.XUpdateQueryService)
col.getService("XUpdateQueryService", "1.0");

      // 5. XUpdateで更新
      BufferedReader reader = new BufferedReader(new FileReader(filename));
      StringBuffer xupdate = new StringBuffer();
      try {
        String line;
        final String lineSeparator = System.getProperty("line.separator");
        while (null != (line = reader.readLine())) {
          xupdate.append(line);
          xupdate.append(lineSeparator);
        }
        long num = service.update(xupdate.toString());
        System.err.println("Number: " + num);
      }
      catch (IOException e) {
        System.err.println("IO Exception occured");
        System.err.println(e);
      }
      finally {
        reader.close();
      }
    }
    catch (XMLDBException e) {
      System.err.println("XML:DB Exception occured " + e.errorCode);
      System.err.println(e);
    }
    finally {
      if (col != null) {
        // 6. コレクションのクローズ
        col.close();
      }
    }
  }
}

 1・2・6は第2回の検索のサンプルと同じです。3では、XPathQueryServiceの代わりにXUpdateQueryServiceを使うように変更しています。そして、5では、ファイルから読み込んだXUpdateを使って更新しています。

 では、実際にこのサンプルを実行してみましょう。前提条件として、最初に示した次のXMLをカレントディレクトリにupdate.xmlというファイル名で保存してあるとします。

<xupdate:modifications version="1.0" xmlns:xupdate="http://www.xmldb.org/xupdate">
  <xupdate:update select="problem[@id='ID0002']/@status">closed</xupdate:update>
</xupdate:modifications>

 以下のコマンドを実行します。

java XUpdate update.xml

 次のように表示されれば成功です。

Number: 1

 実際に更新されたかどうかは、次のようにxindice xpathコマンドを実行することで確認できます。

xindice xpath -c /db/sampledb -q "/problem[@id='ID0002']"

最後に

 これまで、Xindiceを題材にネイティブXMLデータベースの使い方を簡単に紹介してきましたが、いかがだったでしょうか。興味を持って取り組んでいただくきっかけになったのであれば幸いです。

9/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 記事ランキング

本日月間