mb_language("uni"); mb_internal_encoding("utf-8"); mb_http_input("auto"); mb_http_output("utf-8"); ?>
前回、前々回とXML DB連携の例として、Java言語をベースに説明を行ってきた。しかし当然のことながら、XML DBはJava言語のためだけのものではない。例えば、本連載で取り上げているXprioriならば、Java、C++、Visual Basic、.NETをはじめとした多くのアプリケーション・インターフェイスを標準的に備えている。これらのインターフェイスを利用することで、現在よく使われているほとんどの言語からほぼ同一の手法でXprioriにアクセスすることができる。
本稿では、Java(J2EE)と並んでよく利用されているサーバサイド実行環境の1つとして、ASP.NETを取り上げる。前回の記事で紹介したXmlSearch.javaとXmlSearch2.javaをASP.NETのWebフォームに置き換えてみよう。また、その際、前回のサンプルでは抽出の条件となる注文番号をハード・コーディングしていたが、本稿ではサーバサイド・アプリケーションらしく、ユーザーが入力した注文番号を元にXprioriデータベースを検索するように修正してみよう。
本稿で紹介するアプリケーションを構築/実行するために必要なソフトウェアは、以下のとおりだ。
本稿ではそれぞれのインストール手順に関する詳細は割愛するが、自環境にインストールされていないものについては適宜、準備してほしい。また、Xprioriのインストール手順については、別稿「Xprioriで始めるXML DBプログラミング」で詳述しているので、併せて参照してほしい。初期データについても、別稿「Xprioriで始めるXML DBプログラミング(2)」で紹介した初期データorder1~3.xmlがあらかじめ投入されているものとする。
まずは、XmlSearch.javaをASP.NETアプリケーションに置き換える過程で、ASP.NETアプリケーションからXprioriデータベースにアクセスする基本的な手順をおさえておこう。なお本稿では、Visual Basic .NETのコードを用いて解説していく。
[1]Xprioriへの参照を追加する
ASP.NETからXprioriに対してアクセスするには、まずXprioriが提供するCOMコンポーネントに対する「参照」設定を行う必要がある。VS.NETのプロジェクトを起動したら、メニューバーの[プロジェクト]-[参照の追加]を選択する。[参照の追加]ダイアログが表示されるので、[COM]タブから「NeoCoreXMS 3.0 Type Library」を選択する(図1)。
図1 [参照の追加]ダイアログ
これで、現在のプロジェクトからXprioriのライブラリが利用できるようになった。
[2]Webフォームを作成する
次に、新しいWebフォームページとしてXmlSearch.aspxを作成する。フォーム・デザイナからは、以下のようにサーバ・コントロールを配置する。
図2 XmlSearch.aspxのデザイン
それぞれのサーバ・コントロールに対するプロパティの設定は、以下のとおりだ。
コントロール | プロパティ | 設定値 |
---|---|---|
TextBox | (ID) | txtOrder |
Button | (ID) Text |
btnSearch 検索 |
Label | (ID) Text |
lblOrder △(ブランク) |
Label | (ID) Text |
lblName △(ブランク) |
Label | (ID) Text |
lblSupply △(ブランク) |
[3]イベント・プロシージャを記述する
コントロールの配置ができたら、次にButtonコントロールをクリックしたタイミングで発生する処理を記述しよう。フォーム・デザイナ上に配置された[検索]ボタンをクリックすると、コード・エディタが開き、btnSearch_Clickイベント・プロシージャの骨組みが自動生成される。この骨組みに対して、下記のようなコードを追記する。
Imports System.Xml ←(コード冒頭に追記) Private Sub btnSearch_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles btnSearch.Click Dim session As NEOCOREXMSLib.NeoCoreAPIClass = _ New NEOCOREXMSLib.NeoCoreAPIClass() ' データベースへのセッションを確立 session.connectToNeoCoreXMS("localhost", 7700, "ja", "UTF-8", "") session.login("Administrator", "admin") ' Xprioriデータベースを検索し、注文情報を取得 ' XmlDocumentオブジェクトを生成する Dim objDoc As XmlDocument = New XmlDocument() objDoc.LoadXml(session.queryXML("/ND/注文[注文番号='" & txtOrder.Text & "']")) ' 生成したDOMツリーから必要な注文情報を出力 lblOrder.Text = _ objDoc.GetElementsByTagName("注文番号").Item(0).FirstChild.Value lblName.Text = _ objDoc.GetElementsByTagName("商品名").Item(0).FirstChild.Value lblSupply.Text = _ objDoc.GetElementsByTagName("購入先名").Item(0).FirstChild.Value ' データベースからログアウト session.closeConnection() End Sub
前回のコードでは、queryXMLメソッドに対して固定的なXPath式をハード・コーディングしていたのに対して、本稿ではTextBoxコントロールから入力された注文番号をもとに動的にXPath式を生成している。しかし、コードとしての流れは前回のそれとほとんど変わらないことが分かるだろう。
コードの編集が完了したら、ツールバーの[>](開始)ボタンをクリックする。自動的にコードのコンパイル処理が行われ、コードに問題がなければ、Internet Exploler(IE)にXmlSearch.aspxが表示される。
図3 XmlSearch.aspxの初期画面
図4 XmlSearch.aspxの実行結果
テキストボックスから入力された注文番号に従ってXprioriデータベースを検索し、マッチした注文情報が表示された。
図4のように、注文番号に対応する注文情報が表示されれば、まずは成功だ。
それでは次に、スキーマ情報の変更を行ってみよう。データとしては、前回の記事でも用いたorder4.xmlを用いる。order1~3.xmlと異なる点は、新たに仲介情報を追加している点だ。
前回の記事でもそうであったように、XML DBではスキーマの変更に際して、なにかしら特別な操作を行う必要はない。スキーマ変更が必要になったデータから順に、新たなフォーマットでデータを投入していけばよいのだ。後は、新たに追加した情報に対応できるようアプリケーションを変更してやればよい。
以下、XmlSearch.aspxからの変更個所に注目してみていこう。
[1]Labelコントロールを追加する
まずは、取得した仲介情報(仲介業者名)を表示するためのLabelコントロールを、フォーム・デザイナから追加する。
図5 XmlSearch.aspxの変更
LabelコントロールのlblMiddleにおけるプロパティの設定は、以下のとおりだ。
コントロール | プロパティ | 設定値 |
---|---|---|
Label | (ID) Text |
lblMiddle △(ブランク) |
[2]イベント・プロシージャを変更する
次に、btnSearch_Clickイベント・プロシージャに仲介情報を取得するためのコードを追加する。以下リストの太字部分が前述のコードからの変更部分になる。
Private Sub btnSearch_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles btnSearch.Click Dim session As NEOCOREXMSLib.NeoCoreAPIClass = _ New NEOCOREXMSLib.NeoCoreAPIClass() session.connectToNeoCoreXMS("localhost", 7700, "ja", "UTF-8", "") session.login("Administrator", "admin") Dim objDoc As XmlDocument = New XmlDocument() objDoc.LoadXml(session.queryXML("/ND/注文[注文番号='" & txtOrder.Text & "']")) lblOrder.Text = _ objDoc.GetElementsByTagName("注文番号").Item(0).FirstChild.Value lblName.Text = _ objDoc.GetElementsByTagName("商品名").Item(0).FirstChild.Value lblSupply.Text = _ objDoc.GetElementsByTagName("購入先名").Item(0).FirstChild.Value Dim objElm As XmlNode = objDoc.GetElementsByTagName("仲介業者名").Item(0) If IsNothing(objElm) Then lblMiddle.Text = "" Else lblMiddle.Text = objElm.FirstChild.Value End If session.closeConnection() End Sub
途中でスキーマ情報を変更した場合、必ずしもすべての注文情報に<仲介業者名>要素が含まれていない可能性がある。このような要素であっても、アプリケーション側でNothing(C#ならばnull)の判定を行うコードを追加するだけで簡単に対応できる。本稿のサンプルでは、XMLデータのスキーマ変更がアプリケーションに与える影響を分かりやすく解説するために、<仲介業者名>要素についてのみチェックを追加したが、実際の開発では各ノードにあらかじめnull判定のコードを実装しておけば、スキーマ変更時のインパクトはさらに小さくなるだろう。
以上、コードの編集が完了したら、先ほどと同様に、アプリケーションを開始してみよう。仲介情報を持つ注文データを検索すると、以下のように仲介業者名が表示されるはずだ。
図6 変更したXmlSearch.aspxの実行結果
以上、本稿では前回で紹介したJavaアプリケーションをASP.NETアプリケーションに移植してみたが、JavaでもASP.NETでも、まったく同じ要領でスキーマの変更に対応できることがお分かりいただけただろう。XML DBのスキーマ変更における耐性は、扱う言語や技術に限定されるものではないのだ。
▲このページのTOPへ