連載 SQL ServerでXMLを操作する
最終回:リレーショナルDBにXML文書を追加する

これまでの連載では、SQL ServerからデータをXML文書形式で取り出す方法について説明してきました、最終回の今回は逆に、XML文書形式のデータをSQL Serverに格納する方法について説明します。

富士ソフトABC株式会社
技術センター
2002/7/26


XML文書形式のデータをSQL Serverに格納する方法

 XML文書形式のデータをSQL Serverに格納する方法は2つ考えられます。1つはXML文書を分解してSQL文(INSERT文)を構築し、実行する方法、もう1つはSQL Server 2000で新たに追加された機能の1つであるOPENXMLを利用する方法です。それぞれの方法について説明していきましょう。

XML文書とテーブル構造の関係

 XML文書形式のデータをSQL Serverに格納する場合、XML文書内の要素や属性がSQL Serverのテーブル内のどのカラムに対応するのかを事前に確認する必要があります。間違ったマッピングをすると、挿入時にエラーになったり間違ったデータを挿入したりして、後で修正することになり、無用な手間がかかってしまいます。

 今回挿入するデータは次のような構造になっています。

データの構造
個人情報
├─氏名(大阪虎)
├─年齢(12)
├─郵便番号(550-0000)
├─都道府県(大阪府)
├─市町村(大阪市)
├─番地(0-00-000)
├─建物(---)
├─電話番号(06-1010-xxxx)
└─E-Mail(tora@xyz.ff.jp)

 これをXML文書で表すと次のようになります。

XML文書で表したデータ
<個人情報>
  <氏名>大阪虎</氏名>
  <年齢>12</年齢>
  <郵便番号>550-0000</郵便番号>
  <都道府県>大阪府</都道府県>
  <市町村>大阪市</市町村>
  <番地>0-00-000</番地>
  <建物></建物>
  <電話番号>06-1010-xxxx</電話番号>
  <E-Mail>tora@xyz.ff.jp</E-Mail>
</個人情報>

 対するSQL Serverの“Person”テーブルの構造は次のようになっています。

Personテーブルの構造
Name ………………氏名
Age…………………年齢
PostalCode………郵便番号
State ……………都道府県
City………………市町村
Address …………番地
Building…………建物
Phone ……………電話番号
MailAddr…………メールアドレス

 両者のそれぞれ対応する情報を取り出してINSERT文を構築していきます。構築はスクリプトとDOM(Document Object Model)を使用します。スクリプト内でDOMのオブジェクトを作成し、XML文書を読み込んで構造をたどりながらデータを取り出してINSERT文を構築します。

 スクリプトについてはこれまでにも説明してきているので、説明は必要な個所だけに留め、DOMについても利用するオブジェクトやメソッドについて簡単に説明します。

SQL文の構築(INSERT文を構築する)

 まずは定形化できる文字列について定義しておきます。構築するINSERT文の中で、挿入するデータ以外は定形化できるので以下のように定義します。

var strFix = "INSERT INTO Person
(Name,Age,PostalCode,State,City,Address,Building,Phone,
MailAddr) VALUES (";

 挿入先のテーブル名やカラム名はすでに分かっているので、このように定義できます。

 次にデータベースのオープンとコネクションの作成、挿入するXML文書の読み込みです。これらの処理についてはすでに説明しているので、サンプルソースを参照してください。

 次は挿入するデータをXML文書から取り出します。まずは個人情報ノードの一覧を取り出します。

var objNd = objXML.documentElement.selectNodes("個人情報");

 selectNodes("個人情報")と指定することで、個人情報ノードの一覧を取り出すことができます。あとは一覧の中の情報を1つ1つ処理していくことになります。一覧として取り出されたノード数はlengthメソッドで取得することができるので、ループの処理回数として利用します。

 一覧として取り出したノードは、インデックスで個々を特定することができます。objNd(0)やobjNd(1)、ループ処理の中であればobjNd(Idx)と指定します。サンプルソースの中では処理しやすいように、いったんテンポラリのオブジェクトを作成してコピーしています。

 いよいよINSERT文を構築していきます。最初に定義した定形的な文字列を構築用のオブジェクトにコピーします。続いて「氏名」の情報を取り出してコピーした文字列に連結します。ここではselectSingleNode("氏名")と指定しています。このメソッドは指定されたオブジェクトに格納されているノード配下から、パラメタで指定された要素名の最初に見つかったノードを返すものです。見つかったノードで定義されている情報は、textメソッドで参照することができます。サンプルソースでは次のように記述して挿入するデータを取り出しています。

tmpNd.selectSingleNode("氏名").text;

 そのほかの情報についても同様に取り出して連結していきます。注意する点は、各データの区切りとして“,”(カンマ)を加えることと、文字列のデータの場合は“'”(シングルクオート)でくくり、数値の場合はくくらないようにすることです。データ型に合ったSQL文を構築しないと、SQL文の実行時にエラーが発生します。以上のことに注意してINSERT文の構築を記述すると以下のようになります。

strDat = strFix;
strDat += "'" + tmpNd.selectSingleNode("氏名").text + "',";
strDat += tmpNd.selectSingleNode("年齢").text + ",";
strDat += "'" + tmpNd.selectSingleNode("郵便番号").text + "',";
strDat += "'" + tmpNd.selectSingleNode("都道府県").text + "',";
strDat += "'" + tmpNd.selectSingleNode("市町村").text + "',";
strDat += "'" + tmpNd.selectSingleNode("番地").text + "',";
strDat += "'" + tmpNd.selectSingleNode("建物").text + "',";
strDat += "'" + tmpNd.selectSingleNode("電話番号").text + "',";
strDat += "'" + tmpNd.selectSingleNode("E-Mail").text + "')";

 INSERT文の構築が終わったら、Execute()メソッドでSQL文を実行します。

objCon.Execute(strDat);

 あとはオープンしたデータベースをクローズしてスクリプトの記述は終わりです。

 挿入する情報が単純な場合は、このようにINSERT文を構築する方法でデータ登録した方が早くできます。

サンプルプログラム

 実際にサンプルを作成してみました。DataIns.htmlは、SQL文(INSERT文)を構築し、データを登録するスクリプトのサンプル。登録するデータは、PersonData.xmlとして用意しました。実行すると画面1のようになります。

画面1 サンプルの実行画面。ボタンを押すと登録を実行

 次のページでは、OPENXMLを利用したデータの挿入について紹介します。

6/7

Index
SQL ServerでXMLを操作する
  SQL Server 2000でXML機能を使えるようにする
・SQL Server 2000のXML対応機能とは?
・この記事で使用するデータ
・SQL Server 2000の設定
  リレーショナルデータをXML文書として取り出す
・リレーショナルデータとXML文書のマッピング
・SQL ServerのデータをXML文書として取り出す
・FOR XML句でデータを取り出す
・ELEMENTSオプションの指定
・RAWモードの指定
・EXPLICITモードの指定
  クライアントサイド・スクリプトでSQL Serverを操作する
・サーバサイド・スクリプトとクライアントサイド・スクリプト

・スクリプトでデータを取り出す
・取り出したデータのXML文書化
  XSLTでXML文書をHTMLに変換
・XSLTスタイルシートの作成
・クライアントサイド・スクリプトからXSLTを呼び出す
・スクリプトをサーバサイド・スクリプトに作り替える
  XPathを使って、SQL Serverでクエリを実行する
・データベースをXML文書に見せかける
・ダイレクトにXPathを指定する方法
・テンプレートを使用する方法
・スキーマを使用する方法
XML文書形式のデータをSQL Serverに格納する方法
・XML文書とテーブル構造の関係
・SQL文の構築(INSERT文を構築する)
・サンプルプログラム
  ストアドプロシージャを利用したデータの追加
・OPENXMLの仕組み
・ストアドプロシージャの作成と呼び出し
・挿入されたデータを確認する
・INSERT文とOPENXMLのどちらを使うべきか


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

注目のテーマ

HTML5+UX 記事ランキング

本日月間