メイン画像

VBScript - XML を読み込む

VBScript - XML を読み込む


データベースの接続先やメールの通知先など、設定値を外部ファイルに持たせたいときがあります。

VBA であれば Ini ファイルを使って外出しにできますが、VBScript には Ini ファイルを扱う機能はありません。

そんなときは XML で管理すると便利です。

VBScript で XML を扱うには MSXML2.DOMDocument オブジェクトを使います。

XML の読み込み

XML を扱うには、まず XML をオブジェクトに読み込む必要があります。

ファイル、または文字列の XML を読み込めます。

どちらから読み込んだとしても、読み込み後は同じように使えます。

XML ファイルを読み込む

XML ファイルを読み込むときは load メソッドを使います。

load メソッドは読み込みに成功すると True を返すので、True のときだけ処理するようにします。

With CreateObject("MSXML2.DOMDocument")
    If .load("C:\path\to\file.xml") Then
        'TODO: 読み込み成功時の処理を書く
    End If
End With

文字列の XML を読み込む

文字列の XML を読み込むときは loadXML メソッドを使います。

load メソッドと同様で読み込みに成功すると True を返すので、True のときだけ処理するようにします。

Dim xml
xml = "<?xml version=""1.0"" encoding=""utf-8""?><configuration> ... 省略 ... </configuration>"

With CreateObject("MSXML2.DOMDocument")
    If .loadXML(xml) Then
        'TODO: 読み込み成功時の処理を書く
    End If
End With

読み込みに失敗した理由を取得する

parseError プロパティよりエラーコードと理由を取得できます。

errorCode がエラーコード、reason がエラーの理由です。

*読み込み成功時の値は、errorCode が 0 、reason は空文字です。

With CreateObject("MSXML2.DOMDocument")
    If .load("C:\path\to\file.xml") Then
        'TODO: 読み込み成功時の処理を書く
    Else
        '読み込みエラーの内容を表示する
        WScript.Echo CStr(.parseError.errorCode) & ": " & .parseError.reason
    End If
End With

たとえば存在しないファイルを読み込もうとした場合、以下の内容が表示されます。

-2146697211: 指定されたリソースが見つかりません。

XML の解析

XML をルート要素から読み取る

以下は読み込んだ XML をルート要素から順に読み取るスクリプトです。

ルート要素を DisplayData プロシージャに渡し、XML の内容を表示しています。

With CreateObject("MSXML2.DOMDocument")
    If .load("C:\path\to\file.xml") Then
        DisplayData .childNodes
    End If
End With

Sub DisplayData(nodes)
    Dim item
    For Each item In nodes
        '要素を表示する
        WScript.Echo item.nodeType, item.nodeName, item.nodeValue
        
        '要素の属性を表示する
        If Not item.attributes Is Nothing Then
            Dim atrb
            For Each atrb In item.attributes
                WScript.Echo vbTab, atrb.nodeType, atrb.name, atrb.text
            Next
        End If
        
        '子要素があればその内容を表示する
        If item.hasChildNodes Then
            DisplayData item.childNodes
        End If
    Next
End Sub
nodeType プロパティ
ノードの種類を表します。
nodeType プロパティの主な内容
種類 内容
NODE_ELEMENT 1 要素
NODE_ATTRIBUTE 2 要素の属性
NODE_TEXT 3 要素のテキスト
NODE_PROCESSING_INSTRUCTION 7 処理命令(<??> で囲まれた文のこと)
NODE_COMMENT 8 コメント
NODE_DOCUMENT_TYPE 10 ドキュメントタイプ宣言
例:<!DOCTYPE>
nodeName プロパティ
要素名を取得します。
nodeValue プロパティ
要素の値を取得します。
text プロパティ
要素が持つテキストを取得します。
childNodes プロパティ
子要素のコレクションを取得します。
hasChildNodes メソッド
子要素があるかどうかを返します。

XPath 式を使って目的のデータを読み取る

XML の構造が分かっている場合、XPath 式を使って目的の要素からデータを読み取ることもできます。

ルート要素からたどっていく必要がないので、こちらの方が効率的です。
ただし前述のとおり、XML の構造が分かっていないと使えません。

With CreateObject("MSXML2.DOMDocument")
    If .load("C:\path\to\file.xml") Then
        'XPath 式で取得
        Dim nodeList
        Set nodeList = .documentElement.selectNodes("/configuration/appSettings/add[@key='Text']")

        '取得した結果を表示
        Dim item
        For Each item In nodeList
            WScript.Echo item.nodeType, item.nodeName, item.Text
        Next
    End If
End With

selectNodes メソッドは、指定された XPath 式に該当する要素のコレクションを返します。

その後のループで、要素のコレクションを順に取得し、内容を表示しています。

XPath 式のサンプル

次の XML から XPath 式を使ってデータを取得してみます。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="DB1" connectionString="User Id=john; Password=1234; Data Source=db1.world" />
    <add name="DB2" connectionString="User Id=scott; Password=tiger; Data Source=orcl" />
  </connectionStrings>
  <appSettings>
    <add key="Host">example.com</add>
    <add key="Port">25</add>
    <add key="MailAddress">user@example.com</add>
  </appSettings>
</configuration>

要素の指定

/要素名 で指定します。

例)/configuration/appSettings

configuration 要素→ appSettings 要素の配下にあるすべての要素を取得します。

例)/configuration/appSettings/add

configuration 要素→ appSettings 要素の配下にある add 要素を取得します。

属性の指定

/要素名[@属性名] で指定します。

例)/configuration/appSettings/add[@key]

configuration 要素→ appSettings 要素の配下にある add 要素で key 属性を持つ要素を取得します。
属性値は見ません。何でも良いです。

属性値の指定

/要素名[@属性名='属性値'] で指定します。

例)/configuration/appSettings/add[@key='MailAddress']

configuration 要素→ appSettings 要素の配下にある add 要素で key 属性が “MailAddress” である要素を取得します。


アカウントを作成 して、もっと沢山の記事を読みませんか?


この記事が気に入ったら ことりと さんを応援しませんか?
メッセージを添えてチップを送ることができます。


この記事にコメントをしてみませんか?


酒とアクアリウムが最近の楽しみ。

おすすめの記事