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 InitiativeのXUPdateのページに仕様が記述されています。
XUpdateがどんな言語なのか、実感をしていただくために、まずは簡単な例を示します。
XUpdateの例 |
<xupdate:modifications version="1.0" xmlns:xupdate="http://www.xmldb.org/xupdate"> |
この例では、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では、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を使って、先の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"> |
この例では、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"> |
この例では、要素<action>の内で属性「who」が「A_company」のものを削除します。
■ノード名変更
XUpdateには、ノード名の変更のために以下のインストラクションが用意されています。インストラクションのテキストノードで指定した名前に変更します。
- xupdate:rename
selectで指定したノードのローカル名を変更する。
xupdate:renameの例 |
<xupdate:modifications version="1.0" xmlns:xupdate="http://www.xmldb.org/xupdate"> |
この例では、要素<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の使い方 ・サンプルアプリケーション ・実行準備 |
- 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」の詳細も紹介する
|
|