第 6 章 問合せ結果再構築機能の開発
6.6 名前空間への対応
前行がテキストであり,今行がテキストの場合
今行の階層と前行の階層の差分の数だけ終了タグを出力する.
次いで,名前空間と属性が関係表に存在する場合について説明する.開始タグを出力す る際,出力対象の要素・名前空間・属性の情報すべてをシステムが持っていなければなら ない.このことと,終了タグの判定条件に要素・テキストの関係としていることから,要 素を読み込んだ処理の内部処理として名前空間・属性を出力の考慮に入れる.つまり,大 きくは要素とテキストの関係性で処理を行っていき,要素の内部処理の中において名前空 間・属性を考慮し開始タグとして出力する.
しかし,ここで問題になってくるのが,関係表の並び順である.同じ開始タグ内にある 要素・名前空間・属性には同じノードが振られている.そのためtypeカラムでは要素に‟1e‟,
名前空間に‟2a‟,属性に‟3a‟,テキストに‟4t‟という値を保持している.
DeweyOrderの場合
select * from テーブル名 where label like '1%' order by label,type;
PrePostOrderの場合
select * from テーブル名 where start>1 ,end<9 order by start,type;
層のノードで有効となる.有効となっている名前空間を使用する際,名前空間を宣言しなお すことはしない.以下の図 6-6 の XML データを格納した際の Node テーブル,Namespace テーブルを表に示す.ノードラベリング手法はDeweyOrderとする.
図 6-6 格納対象XMLデータ
表 6-1 Nodeテーブルに格納されたデータ
nodeId nsId type name value label
1 null 1e catalog null 1
2 null 2n NS http://www.NS/ 1
3 null 1e book null 1.1
4 null 3a caregory recommendation 1.1
5 3 1e NS:title null 1.1.1
6 3 1e NS:author null 1.1.1.1
7 null 4t null W3C 1.1.1.1.1
表 6-2 Namespaceテーブルに格納されたデータ
nsId nsURI
1 http://www.w3.org/2000/xmlns/
2 http://www.w3.org/XML/1998/namespace
3 http://www.NS/
表6-1のNodeテーブルからは,便宜上docId,pathカラムを省略した形を取っている.
図6-5 において,XPath 式 /category/book で問い合わせた際の表示部分は図6-7に記 載された出力となる.
図 6-7 名前空間に対応できていない出力データ
このように XML 名前空間の接頭辞である‟NS‟がどのように定義されたものかが出力結果 からだけでは把握できなくなってしまう.出力の際,接頭辞にどのような XML 名前空間が 結びついているかについての情報は,使用している接頭辞については表示してほしいとの天 笠准教授の要求があったので,考慮する必要がある.この問題についてどのように解決した かについて説明する.
解決策として,Namespace テーブルに格納された名前空間を,要素を出力する前に全て 読み込み,そのデータを HashMap[13]クラスのオブジェクトに格納する.‟key‟に nsId を,‟value‟に名前空間URIを挿入する.デフォルト名前空間の場合はnullをkeyとする.
要素・属性ノードの場合名前空間に関連づいている場合は nsId カラムに値が格納されてい るので,nsIdカラムに値がある場合は,その値を HashMap に問い合わせて名前区間 URI を得る.そして出力する.その処置を行って出力したデータを図に示す.
図 6-8 重複する名前空間宣言
接頭辞NSがどのようなURIと関連づいているかは把握できるようになった.しかし同じ
NS:author要素の開始タグにおいて既に有効な名前空間を再度宣言している.これは誤りで
はないが通常のXMLデータではこのようなことをしない.
そこで次の方法としてHashMapクラスとVector[14]クラスを用いて名前空間への問題に 対応した.まずHashMapクラスについて説明する.HashMapクラスは名前空間の容れ物 として用いる.‟key‟にprefixを,‟value‟に名前空間URIを挿入する.
次いでVectirの使い方を説明する.VectorはHashMapの容れ物として用いる.HashMap
オブジェクトを部分木の階層ごとに作成し,Vectorオブジェクトに格納する.そのイメージ 図を示す.
図 6-9 名前空間対応イメージ図
名 前 空 間 が 関 連 づ い た レ コ ー ド を 読 み 込むた び に そ の レ コ ー ド の 階 層 に 対 応 す る
HashMap に読み込んだ名前空間を格納する.図6-7 の出力範囲を出力する際に,どのよう
に名前空間に対応するかを説明する.
① nodeId='4'の要素にnsIdが付与されているので,その名前空間をHashMap(階層3)に格
納する
② 階層2,階層1の順に同じ名前空間が挿入されているかどうか確かめる.挿入さえていな いので,当該名前空間を出力する.
③ nodeId='5'の要素にnsIDが付与されているのでその名前空間をHashMap(階層4)に格納
する
④ 階層3,階層2,階層1の順に同じ名前空間が挿入されているかどうか確かめる.階層3 に挿入されているので当該名前空間は挿入されない
⑤ 階層4の終了タグが出力されたので,階層4のHashMapを初期状態に戻す
⑥ 階層3の終了タグが出力されたので,階層3のHashMapを初期状態に戻す 上記の手順を行うことにより図のデータを出力できる.
図 6-10 名前空間対応出力データ