XMLDB開発支援
HOME  >  XMLDB開発支援  >  XML DBプログラミング_1 ~リレーショナルデータベースからXML DBへのデータ移行を進めよう

XML DBプログラミング_1 ~リレーショナルデータベースからXML DBへのデータ移行を進めよう

Xprioriで始めるXML DBプログラミング
~リレーショナルデータベースからXML DBへのデータ移行を進めよう~

2004年11月15日 更新

リレーショナルデータベース(以下、RDB)からXML DBへデータを移行するためのスキーマ設計がそれほど難しくないことは、「これなら簡単 RDBからXML DBへのデータ移行」で紹介した。XMLであるからといって、無理に込み入った階層構造を作る必要はなく、RDBの正規化された一連のテーブル群をJOINして、例えば、Microsoft Excelでも容易に扱えるフラットな構造にしてやればよい。そのうえで、必要ならば意味的にカテゴライズが必要な情報群から徐々に階層構造を構築すればよいのだ。しかし、階層構造を作るのは、あくまで二義的な作業であって、データを移行するうえでの必須の要件ではない。

ここでは「これなら簡単 RDBからXML DBへのデータ移行」で作成したAccessファイル(「.mdb」ファイル)をJavaアプリケーションから動的にXML文書に変換し、それをXprioriに格納する実作業の流れを紹介しよう。Xprioriは無償で利用可能なネイティブXMLデータベース(NXDB)だ。無償とはいえ、商用製品であるNeoCoreXMSとほぼ同様の機能を提供しており、導入も容易なので、まずはNXDBがどのようなものか、その感触を体験してみるには最適の選択肢となるはずだ。

必要なソフトウェアの環境設定

本記事で紹介するアプリケーションを操作するために必要なソフトウェアは、以下のとおりである。

  • J2SE(Java 2 SDK Standard Edition)
  • Xpriori

2004年11月時点でのJ2SEの最新バージョンは5.0であるが、XprioriはJ2SE5.0では動作しないので注意してほしい。本稿では、バージョン1.4系の最新バージョン1.4.2_05を採用することとする。J2SEのインストールに関する詳細は割愛し、以下では、Xprioriのインストール方法についてのみ概略を紹介しよう。

●Xprioriのインストール

Xprioriは以下のサイトからダウンロード可能だ。ここでは、Windows対応版のインストーラであるxpriori-X.X.XX-win32.exe(X.X.XXはバージョン番号)をダウンロードする。
Xprioriのダウンロード・サイト

[1]インストーラを開始する

インストール自体は、ダウンロードした「xpriori-X.X.XX-win32.exe」をダブルクリックするだけでよい。インストール・ウィザードが起動するので、表1の例に従って必要な情報を入力していく。コンソールのユーザー名/パスワードは、後述する管理コンソールにログインする際に使用するものだ。

表1.インストール・ウィザードの設定例
項目 設定値(例)
インストール先 C:\Xpriori
コンソールのユーザー名 admin
コンソールのパスワード admin
デフォルトのアクセスコントロールを有効にする チェックする
管理者のユーザー名 Administrator(変更不可)
管理者のパスワード admin

インストールの途中で、Xprioriを利用するためのアクティベーションを行う必要がある。アクティベーションを行うと、指定したメールアドレスにライセンス・ファイルが送付されてくる。使用に先立っては、このライセンス・ファイルを上記のインストール先であれば「C:\Xpriori\neoxml\config」にコピーしておく。

以上でXprioriのインストールは完了だ。通常は、デフォルトでXprioriサーバが起動するが、手動でサーバの起動/終了を行いたい場合には、スタートメニューから[すべてのプログラム]-[Xpriori]-[Start NeoServer]/[Stop NeoServer]で行うこともできる。

[2]Xprioriの動作を確認する

スタートメニューから[すべてのプログラム]-[Xpriori]-[Launch XMS Console]を選択する。認証ダイアログが表示されるので、ここではインストール時に設定したコンソールのユーザー名/パスワードを入力すればよい。以下のような画面が表示されればXprioriは正常に動作している。

NeoCoreXMS Consoleのトップ画面
図1 NeoCoreXMS Consoleのトップ画面

XMS Consoleは、Xprioriの管理画面であり、Xprioriの動作に関する基本的な設定やデータの登録/参照などを行うことができる。基本的な処理を行うだけであれば、特に初期設定などは必要ないので、ここではまずこのようなツールがあるのだという点だけを覚えておこう。

RDBのテーブルをXprioriに移行する

Xprioriが正常に動作していることが確認できたところで、いよいよAccess上のテーブルをXpriori上に移行してみる。サンプルのAccessファイル(顧客.mdb)は、以下からダウンロードすることができる。
Accessファイル(顧客.mdb)のダウンロード

Access上のテーブルは図2のとおり、3つのテーブルから構成されている。

移行元のAccessデータ構成画面
図2 移行元のAccessデータ構成

[注意]
JavaアプリケーションからAccessデータベースにアクセスするためには、ダウンロードした「.mdb」ファイルをあらかじめODBCデータソースに登録しておく必要がある。ODBCへの登録は、スタートメニューから[管理ツール]-[データソース(ODBC)]から行うことができる。ここでは、データソース名を「xmldb」とする。

●XprioriにXML文字列を登録する

ここでは、顧客.mdbの3つのテーブルをJOINして、その結果をXML文書に変換し、Xprioriに格納する。以下のようなJavaアプリケーションを用意する。今回はXML文書の構造を単純にしているため、JavaのDOMインターフェイスは使用していない。

package to.msn.wings.samples;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

import com.neocore.httpclient.SessionManagedNeoConnection;

public class Rdb2Xmldb {
  public static void main(String[] args) {
    Connection db=null;
    PreparedStatement objPs=null;
    ResultSet rs=null;  
    StringBuffer objSb=new StringBuffer();
    try {
       // Accessデータベースからデータを取得
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
      db=DriverManager.getConnection("jdbc:odbc:xmldb","","");
      objPs=db.prepareStatement
	  ("SELECT 顧客表.姓, 顧客表.名, 顧客表.年齢,業種表.業種名, 職種表.職種名 FROM 
	  職種表 INNER JOIN (業種表 INNER JOIN 顧客表 ON 業種表.業種ID = 顧客表.業種ID) 
	  ON 職種表.職種ID = 顧客表.職種ID");
      rs=objPs.executeQuery();

       // 別稿の「コード3(customer03.xml)」相当のXML文書を生成
      ResultSetMetaData rsmd=rs.getMetaData();
      objSb.append("<?xml version='1.0' encoding='UTF-8' ?>");
      objSb.append("<顧客データ>");
      while(rs.next()){
        objSb.append("<顧客>");
        for(int i=1;i<=rsmd.getColumnCount();i++){
          objSb.append("<" + rsmd.getColumnName(i) + ">");
          objSb.append(rs.getString(i));
          objSb.append("</" + rsmd.getColumnName(i) + ">");
        }
        objSb.append("</顧客>");
      }
      objSb.append("</顧客データ>");

       // Xprioriへのセッションを確立
      SessionManagedNeoConnection session
        =new SessionManagedNeoConnection("localhost",7700); 

       // ログイン処理
      String id=session.login("Administrator","admin");

       // 生成したXML文書(文字列)をXprioriに登録
      String result=session.storeXML(objSb.toString(), null, null); 

       // ログアウト処理
      session.logout();

    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        if(rs!=null){rs.close();}
        if(objPs!=null){objPs.close();}
        if(db!=null){db.close();}
      } catch (SQLException se) {
        se.printStackTrace();
      }
    }
  }
}

以上のコードを実行するには、コマンドプロンプトから以下のように入力すればよい。特にエラーメッセージなどが表示されなければ成功だ。

> SET CLASSPATH=".;C:\Xpriori\API\Java\lib\xmsclient.jar;"
> javac ./to/msn/wings/samples/Rdb2Xmldb.java
> java to.msn.wings.samples.Rdb2Xmldb

コード自体は長いように思われるかもしれないが、実はその大部分がリレーショナルデータベースの内容をXML文字列に変換している処理にすぎない。Xprioriにかかわる部分は太字の部分にすぎず、以下の手順に示す極めて定型的なものだ。

  • セッションの確立
  • データベースへの接続
  • XMLデータの格納(storeXMLメソッド)
  • ログアウト

なお、ログイン時に使用するユーザー名/パスワードは管理コンソール用とは異なるので注意してほしい。

●登録内容を管理コンソールから確認する

次に、上のコードで登録した内容を管理コンソールから確認してみよう。管理コンソールにログインし、[Database Access]タブを選択する。ログインIDとパスワードを聞かれるので、ここではデータベース管理者のIDとパスワードを入力する。

データベースの内容を参照するには、メニューから[Query]を選択し、XQuery Targetとして、以下の式を指定すればよい。

/ND/顧客データ

「ND」はXprioriサーバ全体のルートだと思っておけばよいだろう。格納されたXMLデータのすべてはこのNDノードの子ノードとして格納される。今回格納したXML文書のドキュメントルートは<顧客データ>なので、Xprioriから全文を参照するにはXpath式として「/ND/顧客データ」を指定する。このクエリの結果、以下のようなXMLデータが表示されれば成功だ。

NeoCoreXMSコンソール画面
図3 XMS Consoleからクエリを発行し、データを表示させた

同様に「/ND/顧客データ/顧客/顧客ID」などのクエリを試してみれば、XML DBがどのように動作するものなのか、実感としてつかめるだろう。

XMLデータをファイルから投入する

先ほどの例では、RDBから動的に生成したXML文字列をXprioriに格納したが、XMLデータがあらかじめファイルとして用意されているならば、これをそのまま投入することも可能だ。以下のJavaアプリケーションを見てみよう。

package to.msn.wings.samples;

import com.neocore.httpclient.SessionManagedNeoConnection;

public class XmlStore { 
  public static void main(String[] args){
    try {
      SessionManagedNeoConnection session=
        new SessionManagedNeoConnection("localhost",7700); 
      String id=session.login("Administrator","admin");
      String result=session.storeFileXML("c:\\sample.xml", null, null); 
      session.logout(); 
    } catch (Exception e) {
      e.printStackTrace();
    }
   }
}

先ほどのstoreXMLメソッドが、storeFileXMLメソッドに代わっただけである。以上のコードを実行するには、コマンドプロンプトから以下のコマンドを入力すればよい。

> SET CLASSPATH=".;C:\Xpriori\API\Java\lib\xmsclient.jar;"
> javac ./to/msn/wings/samples/XmlStore.java
> java to.msn.wings.samples.XmlStore

先ほど同様、特にエラーメッセージなどが表示されなければ成功だ。格納した内容については、管理コンソールから確認することができる。

以上、XprioriデータベースとJavaアプリケーションを連携する基本的な手法について紹介した。すでにあるRDBのデータも簡単にNXDBに移行できることが実感できたのではないだろうか。次回はデータベースの構造が頻繁に変更される「半定型データ」を扱い、XML DBではデータ構造の変更がもたらすインパクトが、アプリケーション内だけにとどまり、XML DBにはまったく影響を及ぼさないことを検証する。

企画協力:アイティメディア株式会社
アイティメディア株式会社ロゴ

▲このページのTOPへ

  • XMLとは?IT初心者でもすぐわかるXML超入門
  • 無償で使える!XMLDB「NeoCore」
  • サイバーテック求人情報
  • メールマガジン申し込み
  • TEchScore

  • ▲NeoCoreについて記載されています!

  • ▲XMLマスター教則本です。試験対策はこれでばっちり!
Copyright (c) CyberTech corporation ltd. All ights Reserved. | サイバーテックについて | ご利用ガイド