はじめに
VBScriptでXMLファイルを扱うには、Msxml2.DOMDocumentオブジェクトを使います。このMsxml2.DOMDocumentオブジェクト利用すると、XMLファイルのパース(解析)がとても楽にできるようです。
技術評論社
売り上げランキング: 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")