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

XMLデータの更新と削除


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

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


4-1. XUpdate言語の使い方

 最終回となった今回は、JavaのアプリケーションからXindiceに格納されたデータをXUpdateで更新する方法を紹介します。まずXUpdateの説明、そして更新するためのAPIの紹介、最後にXUpdateを試すためのサンプルアプリケーションの紹介という順で進めていきます。題材として利用するXML文書は、第1回「ネイティブXMLデータベースを立ち上げる!」から利用しているprobrem.xmlです。

現在ドラフト中のXUpdate

 Xindiceでは、データの更新を行うためにXUpdateという言語を採用しています 。このXUpdateは、現在W3Cのワーキングドラフトで、XML:DB InitiativeXUPdateのページに仕様が記述されています。

 XUpdateがどんな言語なのか、実感をしていただくために、まずは簡単な例を示します。

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>

 この例では、IDが「ID0002」の問題のステータスを「closed」に変更します。

 XUpdateはXMLベースの言語で、ドキュメントルートとして要素<xupdate:modifications>が必要で、その子要素としてノードの操作を示すインストラクション(上の例では、xupdate:update)を記述します。インストラクションは複数記述可能です。もともとXSLTを参考に設計されたということもあって、XSLTと似ています。

 インストラクションの記述方法は、操作の内容によりますが、どの場合でも属性「select」で対象となるノードを選択します。この選択にはXPathを使います。

 以降で個別のインストラクションの説明をノードの挿入・追加、更新、削除、ノード名変更、そのほかという順で行います。

ノードの挿入・追加

 XUpdateには、ノードの挿入・追加の仕方に応じて、下記の3通りのインストラクションが用意されています。インストラクションの子要素で指定したノードを挿入・追加します。

  • xupdate:insert-before
    selectで指定したノードの前に挿入する
  • xupdate:insert-after
    selectで指定したノードの後に挿入する
  • xupdate:append
    selectで指定したノードのchildで指定された位置の子ノードとして追加する

 言葉では分かりにくいと思いますので、図で説明します。まず、xupdate:insert-beforeとxupdate:insert-afterの違いですが、次の図1のように、ノードPの子ノードとして、C1、C2、C3があったとします。属性「select」でC2が指定された場合、xupdate:insert-beforeではC1とC2の間にノードが挿入されるのに対し、xupdate:insert-afterではC2とC3の間に挿入されます。

図1 XUpdate:insert:beforeとXUpdate:insert-after
C2がselectで指定されていた場合、xupdate:insert-beforeではC1とC2の間に、xupdate:insert-afterでは、C2とC3の間にノードが挿入される

 一方、xupdate:appendの場合は、次の図のように、属性「select」でPを、属性「child」で子ノードの2番目が指定された場合、C1とC2の間に2番目の子ノードとして追加されます。つまり、C2を指定したxupdate:insert-beforeあるいはC1を指定したxupdate:insert-afterと同等です。

図2 XUpdate:append
属性selectでPが、属性childでC2が指定されていた場合、C1とC2の間に2番目のノードとして追加される

 ところで、xupdate:appendのchildでlast()以外を指定する場合は、テキストノードの存在に注意する必要があります。要素の前後にスペースや改行などが入っていると、それがテキストノードとなって、ノードの位置を分かりにくくしてしまいます。

 xupdate:insert-afterとxupdate:appendの例を順に示します。

xupdate:insert-afterの例
<xupdate:modifications version="1.0" xmlns:xupdate="http://www.xmldb.org/xupdate">
  <xupdate:insert-after select="/problem[@id='ID0002']/actions/action[last()]">
    <action who="C_Corp">
      <description>
        様子を見る
      </description>
    </action>
  </xupdate:insert-after>
</xupdate:modifications>

 この例のxupdate:insert-afterでは、IDが「ID0002」の問題の要素<action>を最後の要素として追加しています。

 xupdate:insert-beforeも挿入する位置を除いてxupdate:insert-afterと同じです。

xupdate:appendの例
<xupdate:modifications version="1.0" xmlns:xupdate="http://www.xmldb.org/xupdate">
  <xupdate:append select="//problem[@id='ID0010']/actions" child="last()">
    <action who="D_Corp">
      <description>
        様子を見る2
      </description>
    </action>
  </xupdate:append>
</xupdate:modifications>

 この例は、xupdate:appendを使って、先のxupdate:insert-afterと同じようなことをするように記述してみたものです。属性「child」で追加したい位置を指定します。属性「child」を省略すると、last()を指定したことになります。ただし、「要素<action>の最後のものの後」と「要素<actions>の子要素の最後」は必ずしも一致しないことに注意が必要です(先にも述べたようにテキストノードが入っているとややこしいです)。

ノードの更新

 XUpdateには、ノードの更新のために以下のインストラクションが用意されています。インストラクションのテキストノードで指定した文字列に更新します。

  • xupdate:update
    selectで指定したノードを更新する

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

 この例では、IDが「ID0002」の問題のステータスを「closed」に変更します。このようにxupdate:updateは、文字列の更新しかできません。もし、ノードセットの置き換えのようなことをしたいのであれば、後で説明するxupdate:removeとxupdate:insert-afterを組み合わせるといった方法を取る必要があります。

ノードの削除

 XUpdateには、ノードの削除のために以下のインストラクションが用意されています。

  • xupdate:remove
    selectで指定したノードを削除する。

xupdate:removeの例
<xupdate:modifications version="1.0" xmlns:xupdate="http://www.xmldb.org/xupdate">
  <xupdate:remove select="//problem[@id='ID0002']/actions/action[@who='A_company ']"/>
</xupdate:modifications>

 この例では、要素<action>の内で属性「who」が「A_company」のものを削除します。

ノード名変更

 XUpdateには、ノード名の変更のために以下のインストラクションが用意されています。インストラクションのテキストノードで指定した名前に変更します。

  • xupdate:rename
    selectで指定したノードのローカル名を変更する。

xupdate:renameの例
<xupdate:modifications version="1.0" xmlns:xupdate="http://www.xmldb.org/xupdate">
  <xupdate:rename select="//problem[@id='ID0002']/actions">
    actions2
  </xupdate:rename>
</xupdate:modifications>

 この例では、要素<actions>のローカル名を「actions2」に変更します。これはスキーマの変更など、特殊な例でのみ用いられるインストラクションでしょう。

そのほか

 このほかにもXUpdateの仕様では、変数を定義できるxupdate:variableや、ほかのノードを参照できるxupdate:value-ofといったインストラクションが定義されています。非常に役に立つインストラクションで、Xindiceにも実装されているようですが、Xindice 1.0ではうまく動作しないようなので、ここでは省略します。

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

本日月間