XPathの書式を用いて取得したい要素や属性(Attribute)を指定することで、より少ないコード量で求める値を取得することができるようになります。先ほどの例と同じように、books要素の配下にあるitem要素内のtitle要素の値を取得したいというような場合のコードを見てみましょう。
01 : Dim objDOM, rtResult, nodeList, obj 02 : Set objDOM = WScript.CreateObject("MSXML2.DOMDocument") 03 : rtResult = objDOM.load("Sample.xml") 04 : If rtResult = True Then 05 : Set nodeList = objDOM.documentElement.selectNodes("/books/item/title") 06 : For Each obj In nodeList 07 : MsgBox obj.nodeName & " : " & obj.text 08 : Next 09 : End If 10 : Set objDOM = Nothing
では、順にコードを追っていきましょう。
1行目から3行目までは、いままでと同様に利用する変数の宣言を行い、XML文書のロードを行っています。
4行目と9行目は、ドキュメントが正常に読み込まれたときの動作であることを条件分岐によって指定しています。
いままでと異なるのが、ここから先の4行のコードです。
5行目にあるコードが XPath 式を用いた形での指定方法です。documentElementオブジェクト内に実装されたselectNodesメソッドを実行する際のパラメータとしてXPath式を与えます。"/books/item/title"という指定は、ルート・エレメントからたどり、books要素配下のitem要素内のtitle要素を明示的に指定していることになります。
XPath 式によって指定されたデータを順に表示するため、For Each〜Next文を用いています(6〜8行目)。
いままでは、XML文書内のすべてのデータを操作していた部分をこのように明示的な指定を行うことによって、作業を省略することができるようになっています。つまり、先ほどのようにループを用いてすべてのデータを操作することなく、目的のデータへとたどり着くことができるということです。実際のコード量を減らすことができることから、アプリケーション自身にバグを含ませてしまったり、無限ループから抜け出せなくなってしまったりということはなくなってくるでしょう。
ただし、この手法を用いるときにも注意が必要です。それは、あらかじめターゲットとなるXML文書の構造を知っていることが前提となってしまう点です。構造を知らない状態では、データの所在を特定することができませんので、このようにXPath式を用いた検索などを行うことはできないのです。実際のソリューションなどでは、このような利用局面に応じたコーディングの選択を行っていかなければならないことを付け加えておきたいと思います。
Microsoft XML Parser 3.0で実装されているXPath式は、1999年11月16日にW3Cにおいて勧告された仕様に基づいています。従って、ここで紹介しているselectNodesメソッドにおいて指定される文字列の書式については、この仕様(http://www.w3.org/TR/xpath)を参考に記述していくことができます(XPathの勧告仕様文書の日本語訳が、インフォテリア株式会社のホームページ上で公開されています。[http://www.infoteria.com/jp/contents/xml-data/REC-xpath-19991116-jpn.htm])。
Copyright © ITmedia, Inc. All Rights Reserved.