VBScriptでXMLファイルを読み込む方法について説明します。
XMLファイルとは
XMLは、ExtensibleMarkupLanguageの略です。
日本語に訳すと「拡張可能なマークアップ言語」です。
マークアップ言語とは、タグと呼ばれる特殊な文字列を使用して、文章の構造やタイトル、文字の修飾情報などを埋め込んでいく言語です。
タグとは、<xx>と</xx>のように、スラッシュ(“/”)のないタグとスラッシュのあるタグで囲んだ文字列を修飾するものです。
スラッシュのついていないタグが命令の始まりを示し、スラッシュのついたタグが命令の終わりを示します。
タグの中の言葉を変えることで、囲まれた文字列に修飾情報を与えることができます。
XMLでは、囲んだ文字列をデータとしてわかりやすく管理する目的でタグを使います。
XMLファイルをブラウザに表示
以下のサンプルXMLファイルを用意します。
サンプルXMLファイルはencoding=”UTF-8″と指定しているので、UTF-8でエンコーディングされている必要があります。
■ファイル名:test.xml
<?xml version=”1.0″ encoding=”UTF-8″ ?>
<words>
<item>
<japanese>犬</japanese>
<english>dog</english>
<spanishe>perro</spanishe>
</item>
<item>
<japanese>猫</japanese>
<english>cat</english>
<spanishe>gato</spanishe>
</item>
<item>
<japanese>熊</japanese>
<english>bear</english>
<spanishe>soportar</spanishe>
</item>
</words>
Edgeでファイルを指定して開きます。
XMLファイルを表示しようとすると、このようにツリー上の構造がそのまま表示されます。
これでは、ユーザーから見たときには何を意味しているのかがよく分かりません。
これらを意味あるものとするために、プログラミングを行っていく必要があります。
XMLファイルの内容をプログラムで取得
サンプルXMLファイル(test.xml)の値をプログラムを使用して取得します。
XML DOM(XML Document Object Model)と呼ばれるAPI(Application Programming Interface)を利用して、XMLファイルの内容を取得します。
今回は、XMLファイルの中のjapaneseというタグに記述されている内容を取得します。
Set domDoc = CreateObject(“MSXML2.DOMDocument”)
rtResult = domDoc.load(“C:\temp\test.xml”)
If rtResult = True Then
getchild domDoc.childNodes
End If
Set domDoc = Nothing
Sub getchild(objNode)
For Each obj In objNode
If obj.parentNode.nodeName = “japanese” Then
MsgBox obj.parentNode.nodeName & ” : ” & obj.nodeValue
End If
If obj.hasChildNodes Then
getchild obj.childNodes
End If
Next
End Sub
実行すると、以下のようなメッセージが表示されます。
では、プログラムの内容を説明します。
Set domDoc = CreateObject(“MSXML2.DOMDocument”)
DOMのAPIを利用できるようにする準備です。
VBScriptでXMLファイルを読み込んだり、書き込んだりする場合は、Msxml2.DOMDocumentオブジェクトを使います。
CreateObjectメソッドでオブジェクトを生成します。
rtResult = domDoc.load(“C:\temp\test.xml”)
次に、XMLファイルを読み込みます。
読み込みは、Loadメソッドを使用します。
If rtResult = True Then
getchild domDoc.childNodes
End If
このメソッドが実行された結果、読み取りが成功したときは、rtResultという変数にTrueの値がセットされます。
読み取りに失敗したときは、Falseがセットされます。
XML文書の読み取りが成功した場合、getchildという関数を実行します。
このgetchildという関数は、このVBScriptファイルの中で定義している関数です。
引数には、読み取られたXML文書のchildNodeオブジェクトを指定します。
Set domDoc = Nothing
オブジェクト変数に対してNothingを代入し、メモリ上に用意されたDOMのインスタンスを開放します。
Sub getchild(objNode)
:
End Sub
このgetchildという関数では、引数でNodeオブジェクトが渡されます。
For Each obj In objNode
:
Next
Nodeに含まれている要素を1つづつ取り出し、内側の処理を実行します。
ループが実行されるたびに次の要素へと進んでいきます。
Nodeの要素がなくなった時点でこのループから抜けます。
If obj.parentNode.nodeName = “japanese” Then
MsgBox obj.parentNode.nodeName & ” : ” & obj.nodeValue
End If
日本語名称が含まれているエレメントが「japanese」と分かっているため、直接名称を指定しています。
If obj.hasChildNodes Then
getchild obj.childNodes
End If
再帰呼び出しを行うように記述しています。
現在アクティブになっているエレメントに子のエレメントがあるかないかを判断し、その結果によって再帰呼び出しを行うかを判断しています。
hasChildNodesというメソッドは、子のエレメントを持っているか否かを判断するためのメソッドで、Trueが返ってくれば、子のエレメントを持っており、Falseが返ってくれば、持っていないということになります。
子のNodeを持っている場合には、同じこの関数を再帰的に呼び出します。
再帰呼び出しを利用する場合は、無限ループに入らないように脱出条件に注意が必要です。
このサンプルでは、子のNodeが存在しなければ呼び出されないので問題ありません。
まとめ
VBScriptでXMLファイルを読み込む方法について説明しました。
以上、VBScriptでXMLファイルを読み込むでした。