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” である要素を取得します。
アカウントを作成 して、もっと沢山の記事を読みませんか?
この記事にコメントをしてみませんか?