最新のXML仕様を実践で覚える「XQueryチュートリアル」(1)
XQueryを実体験してみる

XMLの本格利用に向けた重要な技術の1つがXMLデータベースの発展だ。そのカギを握るのは、問い合わせ言語XQueryの標準化である。現在、XQueryは標準化目前のところまできており、実際にXQueryの実装も登場している。本記事は、そのXQueryを実践することを目的とした。

戌亥稔
ビーコンIT
2002/8/7

 本チュートリアルは、XMLデータベースの問い合わせ言語としてW3Cで標準化が進んでいる「XQuery 1.0: An XML Query Language」の学習を目的としたものである。XQueryについては、「標準化目前:注目のXML問い合わせ言語 XQuery」の記事中で、その機能や文法を解説している。XQueryを簡単にいえば、リレーショナルデータベースにおけるSQLのように、XMLデータベースに対して柔軟かつ強力な問い合わせを行うことができる言語だ。SQLが定型データを扱うリレーショナルデータベースの今日の発展に大きく寄与したように、XQueryもXMLデータベースの発展に大きな意味を持つ標準であることは間違いない。

 本チュートリアルでは、このXQueryに対応したアプリケーションである「QuiP」を利用して、XQueryの動作を体験していただくことを通して、XQueryをマスターすることを主眼に置いている。

 QuiPとは独ソフトウェア・エージー社が開発したXQuery 1.0のクエリプロセッサであり、2001年12月20日に提出されたXQueryのワーキングドラフトに対応している。同社の製品ではなく、XQueryの実装と学習を目的に作られ、無料で配布されているアプリケーションだ。ただし、本チュートリアルではQuiPの機能を説明することが目的ではないため、すべての機能を解説してはいない。その点はご了承いただきたい。

QuiPの動作環境

 今回は以下のシステム環境でチュートリアルを作成している。

OS Windows 98(ほかにもWindows系、Linuxで動作可能)
CPU Pentium II(インテル製のほかの上位CPUでも動作可能)
Memory 128Mbytes
HDD 5.82Gbytes
JRE J2SE 1.3.1_02(JRE 1.3以上で動作可能)

 現バージョンのQuiPでサポートする文字コードはUTF-8のみである。故にQuiPで利用するXML文書はUTF-8形式で保存しなければならない。文字コードとしてUTF-8形式をサポートするエディタはいくつかあるので、ここで紹介しておく。

  • Windows 2000の場合
    Windows 2000の場合は、メモ帳が標準でUTF-8をサポートしている。
  • Windows98の場合
    秀丸エディタなど、UTF-8をサポートしているエディタを使用する。

 これ以外にも、もちろんUTF-8をサポートするエディタはあるので、好みのものを探していただきたい。

QuiPのインストール

 ソフトウェア・エージーが提供しているQuiP(以下、ソフトウェア・エージー版)に含まれているファイルには、当然のことながら本チュートリアルの中で使用している日本語サンプルは入っていない。そこで、筆者がサンプルを付加したバージョンをビーコンITのWebサイトに用意した(以下ビーコンIT版)。ビーコンIT版には、ソフトウェア・エージーが提供するファイルに、本チュートリアルで説明しているサンプルのXML文書や問い合わせを加えたものだ。つまり、基本的にはビーコンIT版とソフトウェア・エージー版はサンプルファイルの違いと、Windows 98などでも起動できるようなバッチファイルを追加しただけである。QuiP本体は同じものだ。

記事公開後、ソフトウェア・エージー版はバージョンアップし、2002年4月に公開されたXQueryのドラフトに対応した、バージョン2.2.1になっている。ビーコンIT版も近々2.2.1に変更予定だ。ただし、このバージョンではこの記事に収録したサンプルで一部動作しない可能性がある。サンプルの修正などについては、連載第2回で対応する予定だ。(2002年8月21日)

 ソフトウェア・エージー版で追加されたサンプルファイルのうち、本チュートリアルを実践するのに必要なファイルは、@ITのサイト上にも置き、本チュートリアルから取得可能にしてある。ソフトウェア・エージー版、ビーコンIT版のどちらを選んでも、本チュートリアルを試すことはできるはずだ。また、実際にQuiPを動作させなくても、本チュートリアルで紹介するクエリと結果を追っていくだけでもXQueryの動作を実感できるだろう。

 QuiPの最新アーカイブファイルのダウンロードは下記から行える。

 ここでは、ビーコンIT版を前提にして説明をしていく。

 まず、QuiPを使える状態にしてみよう。取得した圧縮ファイルのQuiP-2111-win32-Tutorial.zipを解凍する。そして、QuipGui.cmd(Windows 98の場合はQuipGui.bat)をクリックする。もし何も起こらない場合は、以下のことをチェックする。

ソフトウェア・エージーが提供するZIPファイルの中には起動ファイルとしてcmdファイルしかなかったので、ビーコンIT版では筆者がbatファイルを作って入れている。

(1) Javaの動作環境がインストールされているか?
動作環境として、JRE 1.3以上の環境が必要である。ちなみに、本チュートリアルではJ2SE 1.3.1_02を使っている。JREは、サン・マイクロシステムズのJavaのWebサイトから入手できる(J2SEのページへのリンク)。
(2) JDKのPATHが通っているか?
QuiPの圧縮ファイルに含まれているQuipGui.cmdには、JDKのパスが決め打ちで入っているが、JDKのバージョンによってこのパスが異なってくる。QuipGui.cmdもしくはQuipGue.batを編集して、正しいパスを設定しよう。
(3) Windowsのバージョンは.cmdファイルを実行できるか?
Windows 2000では.cmdファイルをダブルクリックして実行するが、Windows 98などではbatファイルの方を実行しよう。

画面1 QuiPの初期ウィンドウ

 QuiPが起動したら、上記のGUIの画面が出力されるかを確認しよう。そしてインストールの確認をするために、[File]メニューから[Open]を選択し、QuiPを解凍したフォルダの配下にあるexamples/Tutorial/Queryフォルダの下の「installTest.xquery」を選択する。画面2のように、上部のテキスト入力エリアにクエリが表示されたら、[EXECUTE]ボタンをクリックする。そして、画面2の下部のテキスト出力エリアに結果が出力されるかを確認する。画面3のようにクエリの結果が正しく出力されれば、インストールは正常に終了したことになる。

ソフトウェア・エージー版の利用者は、examplesフォルダの下にTutorialフォルダを作り、さらにその下にQueryフォルダDataフォルダを作成してください。そして、QueryフォルダにinstallTest.xqueryファイルを、Dataフォルダにprojects.xmlをそれぞれ格納してから、上記の操作を試してください。

examples/Tutorial/Queryは、Windows系ではexamples\Tutorial\Queryと記述される。QuiPではどちらの記述をしても構わない。

画面2 試しにクエリを実行してみる

画面3 クエリの結果が表示される

 結果が違った場合は以下の項目を確認する。

  • 右上部Software AGのロゴの下の選択ボタンがFilesystemとなっているか?
  • Filesystemの下の入力ボックスが./exampleとなっているか?

クエリとデータへのファイルパス

 画面1に見るように、QuiPは2つのテキスト入出力エリアからなる。上部のテキスト入力エリアはクエリを入力する部分であり、下部のテキスト出力エリアは結果を出力する部分である。上部右側のロゴの下にあるラジオボタンは、クエリ対象のXML文書が、ファイルとして格納されているのか、それともXMLネイティブデータベースである「Tamino」に格納されているのかを選択するものである。今回のチュートリアルでは検索対象となるXML文書の格納にファイルシステムを使用するが、Taminoを利用したい場合は90日の試用版が提供されているのでそれを利用することをお勧めする。

 XML文書の格納形態にファイルを選んだ場合、「Directory」と書かれた入力エリアには、XML文書が格納されているフォルダを指定する(これをルートフォルダと呼ぶ)。画面4では、ルートフォルダを“./examples”としており、QuiPをインストールしたフォルダの下のexamplesフォルダが指定されている。例えば、画面1で入力したクエリは、次のようなものだった。

document("Tutorial/data/projects.xml")//member/name
InstallTest] インストールテストのための簡単な問い合わせ

 このとき、projects.xmlファイルにはパスとして./examplesが付加され、./examples/Tutorial/data/projects.xmlのファイルを使用すること、という意味になる。また、下記のように、ファイルを絶対パスで表すこともできる。

document("C:/QuiP/examples/Tutorial/data/projects.xml")//member/name

 この場合はルートフォルダの設定は無視される。本チュートリアルにおいては、すべて相対パスで示し、./examplesの配下のTutorialフォルダの下に、DataとQueryというフォルダ名でそれぞれ、XML文書とクエリを保存することとする。

Path表現式によるクエリの実行

 次は、簡単なクエリを実行してみる。次のXML文書は、あるプロジェクトの説明をしたものである。プロジェクト名、プロジェクトの期間、プロジェクトメンバー、そしてそれぞれのメンバーがどれだけの工数をかける予定であるかを記述してある。XMLの特徴を説明するために、それぞれのプロジェクトにかかわっているメンバーは繰り返しを持った要素で表している。Projects.xmlファイルは./examples/Tutorial/dataのフォルダの下にある。

<?xml version="1.0" encoding="UTF-8" ?>
<projects>
  <project code="200200020" start="2002/01/20" end="2002/03/31">
    <name>XMLによる文書管理システム</name>
    <members>
      <member>
        <name>川泉陽一</name>
        <manpower unit="hour">100</manpower>
      </member>
      <member>
        <name>中田聡</name>
        <manpower unit="hour">50</manpower>
      </member>
    </members>
  </project>
  <project code="200200025" start="2002/02/15" end="2002/03/25">
    <name>XMLによるB2Bシステム構築</name>
    <members>
      <member>
        <name>本岡欣也</name>
        <manpower unit="hour">100</manpower>
      </member>
      <member>
        <name>川泉陽一</name>
      <manpower unit="hour">50</manpower>
      </member>
    </members>
  </project>
  <project code="200200031" start="2002/03/15" end="2002/03/31">
    <name>モバイルシステムの構築</name>
    <members>
      <member>
        <name>川泉陽一</name>
        <manpower unit="hour">10</manpower>
      </member>
    </members>
  </project>
</projects>
リスト1 検索対象となるファイルProjects.xml

 このprojects.xmlの中からすべてのプロジェクト名を取り出してみよう。次に示す問い合わせは、Path表現と呼ばれるものだ。Path表現の詳細は、「標準化目前:注目のXML問い合わせ言語 XQuery」の中の、「2つの表現式、PathとFLWR」を参照してほしい。一応ここで簡単に説明すると、Path表現式はXPath 2.0のサブセットで、 ディレクトリを示すようにスラッシュ(/)を使って階層構造を示す表現式だ。

document("Tutorial/data/projects.xml")//project/name
[ example-2-1-1]  projects.xmlの中からすべてのプロジェクト名を取り出す

ビーコンIT版にはexampleファイルも含まれている。上記の“example-2-1-1”の場合は、“example-2-1-1.xquery”ファイルが“./examples/Tutorial/query”フォルダ内にあり、QuiPの[File]メニューから[Open]を選択することで呼び出せる。

  この問い合わせの前半にある、document("Tutorial/data/projects.xml")//project/nameは、“//”の表現によってProjects.xmlの文書中のどこかにあるprojectという要素名を探し出す。故に、上記表現式ですべてのprojectの子要素nameを取り出して表示できる。

 また、document("Tutorial/data/projects.xml")//nameのように記述すると、project.xml中にあるすべてのname要素を探し出すので、画面4のように、プロジェクト名とメンバー名の両方が表示される。

画面4 プロジェクト名とメンバー名の両方が表示される

 XQueryでは、クエリの結果、オリジナルの文書の要素の順番が守られる(ちなみにSQLでは検索結果の行の順番は保証されない)。故に、上記画面4では、クエリの結果がオリジナルの文書と同じ順番で出力されている。結果の順番を変えるには、sort表現式を使う。例えば、プロジェクトの終了が遅い順番に表示したい場合は、sort表現式と、降順を示す“descending”キーワードを使って次のように記述する。

document("Tutorial/data/projects.xml")//project sortby (@end descending)
[ example-2-1-2]  プロジェクトの終了が遅い順番に並び替える

 上記では、結果を降順に表示するために“descending”というキーワードを使っているが、昇順に表示したい場合は、“ascending”というキーワードを記述する。もちろん、これらのキーワードを省略した場合は昇順(ascending)となる。

 名前だけを出力したい場合は次のようになる。

document("Tutorial/data/projects.xml")//project/name sortby (../@end descending)
[ example-2-1-3]  プロジェクトの終了が遅い順番に並び替え、プロジェクト名のみ表示する

 ここで注意しなければいけないのは、ソートキーを指定する場合、“../@end”と、@endの前に“../”が付いている点である。これは親を表すPath表現であり、この場合project/nameの親、つまりprojectの属性を表すために定義している。

 同様にプロジェクト名でソートしたい場合は次のような表記になる。

document("Tutorial/data/projects.xml")//project/name sortby (../name descending)
[ example-2-1-4]  プロジェクト名でソートし、プロジェクト名のみ表示する

FLWR表現式を実行する

 XQueryの特徴はFLWR(フラワーと読む)表現式である。FLWR表現式はリレーショナルデータベースで用いられている問合せ言語SQLのSELECT句、FROM句、WHERE句のように、For、Let、Where、Returnの4つの句からなる、非常に高度で柔軟な演算をXML文書に対して実行できる表現式だ。FLWR表現式の詳しい意味についても、「標準化目前:注目のXML問い合わせ言語 XQuery」を参考にしていただきたい。ここでは実践を中心にしていく。

 簡単なFLWR表現式を実行してみよう。実行する問い合わせ内容は「2名以上メンバーが存在するプロジェクトの名前を表示する」である。まずはこの問い合わせをPath表現式で実行してみる。Path表現式では次のような問い合わせを発行すれば、望みの結果は得られる。

document("Tutorial/data/projects.xml")//project[count(
members/member)>=2]
[ example-2-2-1] 2名以上メンバーが存在するプロジェクトを表示する

画面5 2名以上メンバーが存在するプロジェクトが表示される

 この場合、結果としてオリジナルのXML文書の構造がそのまま返される。しかし結果としてプロジェクト名とプロジェクトのメンバーの名前だけを表示したい場合、FLWR表現式のFor句およびReturn句で次のように記述することができる。

for $i in  
  document("Tutorial/data/projects.xml")//project[count(
members/member)>=2]
return
<result> <project>{$i/name/text()}</project>
<members>{$i//member/name}</members>
</result>
[ example-2-2-2] 2名以上メンバーが存在するプロジェクトのプロジェクト名とメンバーの一覧を作る

 FLWR表現式のReturn句は、検索対象となるXML文書には存在しない要素名や属性を使うことができるのが特徴である。これはXPath式においては記述できなかった機能であり、XQueryの特徴の大きな点である。プロジェクト名をアトリビュートにしたい場合は次のように記述することができる。

for $i in        document("Tutorial/data/projects.xml")//project[count(
members/member)>=2]
return
<result> <project name="{$i/name/text()}" />
<members>{$i//member/name}</members>
</result>
[ example-2-2-3] 2名以上メンバーが存在するプロジェクトのプロジェクト名とメンバーの一覧を作る。ただし、プロジェクト名は属性として作成する

 FLWR表現式ではまた、Where句で条件を設定することができるため、上記問い合わせは次のような記述をしても同様の結果が得られる(画面6)。

for $i in
document("Tutorial/data/projects.xml")//project
let $m := $i//member
where count($i//member) >=2
return
<result> <project>{$i/name/text()}</project>
<members>{$m/name}</members>
</result>
[ example-2-2-4] FLWR表現のWhere句を使い、2名以上メンバーが存在するプロジェクトのプロジェクト名とメンバーの一覧を作る

画面6 2名以上メンバーが存在するプロジェクトが表示される

 今回は、QuiPの基本的な使い方を中心に説明してきた。次回は、このFLWR表現式の続きからチュートリアルを続ける予定だ。

  1/5

Index
連載:XQueryチュートリアル

XQueryを実体験してみる

  XQueryのFLWR表現式を使いこなす
  XQueryの関数を使う、定義する
  XQueryによるXML文書の結合〜1
  XQueryによるXML文書の結合〜2



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

注目のテーマ

HTML5+UX 記事ランキング

本日月間