ASPファイル経由でデータベースと動的に連携する処理は可能ですか
WebサーバとしてマイクロソフトのIISを用い、データベースからASPファイル経由でXMLデータを動的に生成し、Webブラウザ上でHTML,もしくはXHTMLとして表示したいと考えています。具体的な方法について教えてください。

回答/富士ソフトABC株式会社 技術センター
2001/4/27

 実際にいただいた質問はもう少し詳細な内容でしたので、まずはその全文を下記に示します。

 質問:WebサーバとしてマイクロソフトのIISを用い、データベースからASP(Active Server Pages)ファイル経由でXMLデータを動的に生成し、Webブラウザ上でHTML,もしくはXHTMLとして表示したいと考えています。既にクライアント側のブラウザにはMSXML3もしくはほかのパーサが導入済みと仮定して、

  1. XSL(T)、DTD、CSSファイルをあらかじめ作成しておいて
  2. 指定されたASPファイル中のサーバサイドスクリプトでSQLサーバーからデータを読み出し
  3. <?xml ...?>以降の行(データ)を動的に出力して返す(ファイル拡張子は.aspだが、中身はxmlの意)
  4. クライアント側Webブラウザとパーサで各種ファイルを処理し、HTMLもしくはXHTMLファイルとして表示する。

 上記のような流れの処理を行うことは可能でしょうか? また、サーバ側にもMSXML3もしくはほかのパーサを導入しておく必要があるのでしょうか(このケースの場合、特に考慮する必要はないような気がしているのですが……) ?

 では、上記の2つの質問に対して回答しましょう。

1 このような処理が可能か?
可能です。XSL(T)、DTD、CSS などはなくても処理できます。

2 サーバ側に MSXML3 などのパーサを導入する必要があるか?
必要です。クライアント側には導入しなくても構いません。

 例としてデータベースにSQL Server 2000を使用した場合、どのような処理をすればいいかを説明しましょう。下記にASPのサンプルプログラムを示しました。

 このサンプルプログラムでは、

  1. ASPファイル中のサーバサイドスクリプトで、SQL ServerからデータをXML形式で読み出す。
  2. 読み出したデータを、表組みのスタイルでWebブラウザに表示。

 といったことをしています。

 では、詳細について解説していきましょう。SQL Serverのデータベースには、画面1のような顧客情報のデータが入力されているとします。

画面1 データベース名:XMLTemp、テーブル名:Person

 IIS には画面2のような仮想ディレクトリを1つ作成しておきます。ここに、今回のプログラムであるViewSQLXML.aspが配置されています。

画面2 仮想ディレクトリ、SQLXMLTESTを作成する

 この環境で、今回紹介するASPのサンプルプログラムを実行すると、画面3のように、結果がWebブラウザ上で表示されます。

画面3 データベースの内容をWebブラウザで表示した(この画面は、記事に合わせてサイズを加工してあります)

 ASPのサンプルプログラム(ViewSQLXML.asp)は、JavaScriptでコーディングされています。今回使用したプログラムは、ASPのサンプルプログラムViewSQLXML.asp、それに取得したXML形式のデータ getsqldata.xml、表示に利用するスタイルシートはperson.xslです。詳しい動作内容は、コメントで記してありますので、下記をご覧ください。

<html>
 <head>
  <title>顧客情報</title>
 </head>
<body>
 <link rel="stylesheet" type="text/css" href="StyleSheet.css">
 <%@ Language="JavaScript" %>
 <%
  var adPersistXML =1;
  // オブジェクト作成
  // この ASP 内部で利用するオブジェクトを作成しています
  // objCon はデータベースとの接続を行なうためのオブジェクトです
  // objRec はデータを取得するテーブルへのレコードセットを得るためのオブジェクトです
  // objDoc 取得したデータを XML として扱うための DOM ドキュメントのオブジェクトです
  var objCon = Server.CreateObject("ADODB.Connection");
  var objRec = Server.CreateObject("ADODB.Recordset");
  var objDoc = Server.CreateObject("Microsoft.XMLDOM");

  // データベース接続
  // SQL Server への接続を行っています
  // サーバ名:cherry
  // データベース名:XMLTemp
  // ユーザID:sa
  // パスワード:sa
  objCon.Open("uid=sa;pwd=sa;driver={SQL Server};server=cherry;database=XMLTemp");

  // 顧客情報テーブルへのレコードセットオープン
  // Person テーブルのすべてのデータに対するレコードセットを作成しています
  objRec.Open("SELECT * FROM Person", objCon);
  // 顧客情報を XML 形式で XML ドキュメントオブジェクトに保存
  // SQL Server から取得したデータを XML 形式で保存するには、
  // adPersistXML を指定する必要があります
  objRec.Save(objDoc, adPersistXML);
  // レコードセットクローズ
  // データを XML ドキュメントに格納したのでレコードセットを解放します
  objRec.Close();

  // SQL Server から取得した XML データの子ノード一覧へのオブジェクトを取得
  var objNode = objDoc.documentElement.childNodes;
  // 顧客情報データの子ノード一覧へのオブジェクトを取得
  // SQL Server から取得した XML 形式のデータには同一レベルの子ノードとして
  // スキーマ情報も含まれていて、順番はスキーマ情報、実データの順なので、
  // 2つ目の子ノードのさらに子ノード一覧へのオブジェクトを取得している。
  // (インデックスは 0 から始まるのでこの場合は 1 を指定している)
  var objChild = objNode.item(1).childNodes;
 %>

 <!-- 顧客一覧テーブル作成 -->
 <table align="center" border="1" width="800">
  <!-- ヘッダ -->
  <tr>
   <th width="150" align="center">[氏名]</th>
   <th align="center">[住所]</th>
   <th width="150" align="center">[電話番号]</th>
  </tr>

<%
  // 子ノードが無くなるまで繰返し
  for (iii = 0; iii <= objChild.length-1; iii++) {
   // 子ノードへのオブジェクトを取得
   var tmpChild = objChild.item(iii);
%>
   <tr>
    <td width="150" align="left">
     <!-- 名前を出力 -->
     <%=tmpChild.getAttribute("name")%>
    </td>
    <td align="left">
     <!-- 住所を出力 -->
     <%=tmpChild.getAttribute("address")%>
    </td>
    <td width="150" align="left">
     <!-- 電話番号を出力 -->
     <%=tmpChild.getAttribute("phone")%>
    </td>
   </tr>
<%
  }
%>
 </table>

</body>
</html>
リスト1 ASPプログラム。データベースからデータをXML形式で取得、それをWebブラウザに送る

 下記のリストは、SQL ServerからXML形式で取得したときの内容です(注:uid はすべて文字 'X' で書き換えてあります)。SQL Serverからデータを取得すると、ルートノードの子ノードとしてスキーマと実データが定義されている構成になっています。

 スキーマの部分では、テーブルの定義が XML 形式で記述されています。データの部分は1レコードごとにデータが取られ、それぞれのカラムはすべて属性として扱われています。

<xml xmlns:s="uuid:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX2" xmlns:dt="uuid:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
 <s:Schema id="RowsetSchema">
  <s:ElementType name="row" content="eltOnly" rs:CommandTimeout="30">
   <s:AttributeType name="id" rs:number="1" rs:writeunknown="true">
    <s:datatype dt:type="int" dt:maxLength="4" rs:precision="10" rs:fixedlength="true" rs:maybenull="false"/>
   </s:AttributeType>
   <s:AttributeType name="name" rs:number="2" rs:nullable="true" rs:writeunknown="true">
    <s:datatype dt:type="string" dt:maxLength="100"/>
   </s:AttributeType>
   <s:AttributeType name="address" rs:number="3" rs:nullable="true" rs:writeunknown="true">
    <s:datatype dt:type="string" dt:maxLength="200"/>
   </s:AttributeType>
   <s:AttributeType name="phone" rs:number="4" rs:nullable="true" rs:writeunknown="true">
    <s:datatype dt:type="string" dt:maxLength="20"/>
   </s:AttributeType>
   <s:extends type="rs:rowbase"/>
  </s:ElementType>
 </s:Schema>
 <rs:data>
  <z:row id="1" name="AAA" address="BBB" phone="CCC"/>
  <z:row id="2" name="DDD" address="EEE" phone="FFF"/>
  <z:row id="3" name="GGG" address="HHH" phone="III"/>
  <z:row id="4" name="JJJ" address="KKK" phone="LLL"/>
  <z:row id="5" name="MMM" address="NNN" phone="OOO"/>
 </rs:data>
</xml>
リスト2 データベースから取得されたXML形式のデータ

 

「Ask XML Expert」


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

注目のテーマ

HTML5+UX 記事ランキング

本日月間