小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


Msxml2.DOMDocumentを使ってVBScriptでXMLファイルを読み込む

はじめに

VBScriptでXMLファイルを扱うには、Msxml2.DOMDocumentオブジェクトを使います。このMsxml2.DOMDocumentオブジェクト利用すると、XMLファイルのパース(解析)がとても楽にできるようです。

最速攻略 VBScriptサンプル大全集 Windows7/Vista/XP/2000対応
結城 圭介
技術評論社
売り上げランキング: 270,148

Msxml2.DOMDocumentの使い方

VBScriptでMsxml2.DOMDocumentを利用するには、FileSystemObjectと同じように、CreateObjectメソッドでオブジェクトを生成します。

Set objXML = CreateObject("MSXML2.DOMDocument")

WSFファイルで利用する場合には、以下のように書くことであらかじめオブジェクトを生成しておくことができます。

<?xml version="1.0" encoding="Shift_JIS" ?>
<package>
  <job id="main">
  <object id="objXml" progid="Msxml2.DOMDocument" />
  <script language="VBScript">
  (中略)
パースするXMLファイルを用意する。

まずパースするXMLファイルを用意します。はてなダイアリーにはRSS機能があるので、今回はこのXMLファイルを読み込んでみます。
1. ブラウザでhttp://d.hatena.ne.jp/hatena_id/rssにアクセスします。
2. 右クリックでソースを表示して、テキストエディタに貼り付け、保存します。

Msxml2.DOMDocumentでXMLファイルを読んでみる

以下のサンプルコードは、パラメタとして指定されたXMLファイルをパースして、ダイアリーのタイトルとそのURLを出力します。

<?xml version="1.0" encoding="Shift_JIS" ?>
<package>
  <job id="main">
  <?job error="true" debug="true" ?>
  <object id="objFSO" progid="Scripting.FileSystemObject" />
  <object id="objXml" progid="Msxml2.DOMDocument" />
  <script language="VBScript">
  Option Explicit
  <![CDATA[
  Call Main()
  Sub Main()
  
    ' 非同期読み込みを無効にする
    objXml.async = False
    
    Dim xmlFile, nodeRoot, nodeItems, nodeItem, nodeTitle, nodeLink, result
    
    ' パラメタ数のチェック
    If WScript.Arguments.Unnamed.Length <= 0 Then
      WScript.Echo "ファイルが指定されていません。"
      WScript.Quit
    End If
    xmlFile = WScript.Arguments.Unnamed.Item(0)
    
    ' XMLファイルがあるかどうか
    If Not objFSO.FileExists(xmlFile) Then
      WScript.Echo "ファイルが見つかりません。(" & xmlFile & ")"
      WScript.Quit
    End If
    
    ' XMLファイルの読み込み
    result = objXml.Load(xmlFile)
    If Not result Then
      WScript.Echo objXml.parseError.errorCode
      WScript.Echo objXml.parseError.reason
      WScript.Echo objXml.parseError.line
      WScript.Echo objXml.parseError.linepos
      WScript.Echo objXml.parseError.filepos
      WScript.Echo objXml.parseError.srcText
      WScript.Echo objXml.parseError.url
      WScript.Quit
    End If
    
    Set nodeRoot = objXml.documentElement
    ' itemタグのリストを取得
    Set nodeItems = nodeRoot.getElementsByTagName("item")
    
    ' itemタグを1つずつ取り出す。
    For Each nodeItem In nodeItems
      ' titleタグを取り出す
      Set nodeTitle = nodeItem.getElementsByTagName("title").Item(0)
      WScript.Echo nodeTitle.Text
      ' urlタグを取り出す
      Set nodeLink = nodeItem.getElementsByTagName("link").Item(0)
      WScript.Echo nodeLink.Text
    Next
  
  End Sub
  ]]>
  </script>
  </job>
</package>

XMLファイルを読み込むには、Loadメソッドを使用します。このLoadメソッドはファイルが存在しなくても例外をスローしてくれないので、サンプルコードでは事前にファイルがあるかどうかのチェックをしています。

objXml.Load(xmlFile)

XMLのノードを取得する場合には、getElementsByTagNameメソッドを利用します。このメソッドはマッチするものが複数あった場合も動作するよう、戻り値をリストとして返します。今回のサンプルでは.Item(0)で先頭の要素を取得しています。

Set nodeRoot = objXml.documentElement
' itemタグのリストを取得
Set nodeItems = nodeRoot.getElementsByTagName("item")

' itemタグを1つずつ取り出す。
For Each nodeItem In nodeItems
  ' titleタグを取り出す
  Set nodeTitle = nodeItem.getElementsByTagName("title").Item(0)
  WScript.Echo nodeTitle.Text
  ' urlタグを取り出す
  Set nodeLink = nodeItem.getElementsByTagName("link").Item(0)
  WScript.Echo nodeLink.Text
Next
属性値を取得する

ちなみに属性の値を取得する場合には、以下のコードで取得することができます。指定した属性がタグの中にない場合は、nullが返ります。

obj.getAttribute("hoge")