ASH | サーバ | セキュリティ | Linux | FreeBSD | DB | Web | CGI | Perl | Java | XML | プログラム | ネットワーク | 標準 | Tips集

WSHによるDOMの利用について

WSHとは

 WSHとは、Windows Scripting Hostの略で、Windows上でのマクロ機能を実現するためのスクリプトです。 MS-DOSのバッチファイルの強化版としても使えます。
 WSHの言語には、JScript(JavaScript)か、VBScriptが使えます。 拡張子を*.jsや*.vbsとすれば、クリックするだけで実行できます。 WSHは、コマンドプロンプトから、「wscript ファイル名」でも実行できます。 また、「cscript ファイル名」で実行することで、標準出力にも出力できます。
 WSHは、Windows2000やWindows98では、デフォルトで組み込まれています。 また、Windows95やWindowsNTでも、Microsoft社から無料で提供されるモジュールをインストールすれば、使えるようになります。 当然かもしれませんが、Machintoshでは、使えません。

http://www.microsoft.com/japan/developer/scripting/
 Microsoft Scripting Technologies(Microsoft社のページ)

 以下に、WSHを使ったDOMプログラミングのサンプルを示します。 これらのスクリプトはXMLデータとともに、ダウンロードしてから実行してください。

JScriptによるDOMプログラミング

 Vscript(JavaScript)を使って、住所録のデータを一人づつポップアップウィンドウに表示してみます。

addr.js
var objXML, fileXML;
var nodes, node, items, item, mesg

fileXML = 'addr.xml';

objXML = WScript.CreateObject('MSXML.DOMDocument');
objXML.load(fileXML);

nodes = objXML.getElementsByTagName('個人情報');
for (i = 0; i < nodes.length; i++) {
  node = nodes[i];
  mesg = '';

  items = node.childNodes;
  for (j = 0; j < items.length; j++) {
    item = items[j];
    if (mesg != '') {
      mesg = mesg + ', ';
    }
    mesg = mesg + item.nodeName + ':' + item.firstChild.nodeValue;
  }
  WScript.Echo(mesg);
}

 まず、WScript.CreateObject命令で、XML用のobjXMLオブジェクトを生成します。
 XMLオブジェクトを生成したら、loadメソッドで、xmlファイルを読み込みます。
 getElementsByTagNameメソッドで、XMLデータ内の「個人情報」タグを配列(nodes)に取り出し、順に表示します。
 各個人情報は、childNodesメソッドで、要素の一覧を取り出し、nodeNameで、名前や住所などの要素名を表示し、firstChild.nodeValueで、要素の内容を表示しています。 これは、各要素の子に「#text」タグしかないことを前提に、記述しています。 textメソッドを使うと、より簡単に取り出せますが、Microsoft社の独自拡張メソッドですので、移植性に欠けます。
 画面へのポップアップ表示は、WScript.Echoメソッドを使って表示します。 各要素の内容をCSV形式にして表示しています。

 addr.jsとaddr.xmlを同一ディレクトリに格納して、addr.jsを実行してください。

VBcriptによるDOMプログラミング

 VBscriptを使って、住所録のデータを一人づつポップアップウィンドウに表示してみます。 上のJScriptを移植したもので、全く同じ動作をします。

addr.vbs
Dim objXML, fileXML
Dim node, item, mesg

fileXML = "addr.xml"

Set objXML = WScript.CreateObject("MSXML.DOMDocument")
objXML.load(fileXML)

For Each node In objXML.getElementsByTagName("個人情報")
  mesg = ""
  id = node.getAttribute("ID")

  For Each item In node.childNodes
    If mesg <> "" Then
      mesg = mesg & ", "
    End If
    mesg = mesg & item.nodeName & ":" & item.firstChild.nodeValue
  Next
  WScript.Echo mesg
Next

 プログラムの構造は、JScript版と全く同じです。
 VBScript版では、配列データをFor Each命令で、変数に取り出し、順に表示している点が異なります。

 addr.vbsとaddr.xmlを同一ディレクトリに格納して、addr.vbsを実行してください。

サンプルのXMLデータ

 上のサンプルスクリプトで使っている、住所録のXMLデータです。 2つのスクリプトで、XMLデータは共通です。
 文字コードは、Unicodeではなく、Shift_JISで使ってください。

addr.xml
<?xml version="1.0" encoding="Shift_JIS" ?>
<住所録>
  <個人情報 ID="1">
    <名前>升村 丞</名前>
    <郵便番号>920-0967</郵便番号>
    <住所>金沢市菊川1-9-6</住所>
    <電話番号>076-261-4921</電話番号>
  </個人情報>
  <個人情報 ID="2">
    <名前>北陸 太郎</名前>
    <郵便番号>920-0000</郵便番号>
    <住所>金沢市大手町1-1-1</住所>
    <電話番号>076-111-3333</電話番号>
  </個人情報>
  <個人情報 ID="3">
    <名前>金沢 花子</名前>
    <郵便番号>920-0123</郵便番号>
    <住所>金沢市片町1-2-3</住所>
    <電話番号>076-123-4567</電話番号>
  </個人情報>
</住所録>


Copyright (C)1998-1999 ASH multimedia lab.
mail : wmaster@ash.or.jp