ターゲットとなっているデータへのアクセス方法は、幾つかの方法が挙げられます。1つは、前回紹介したように要素内を検索し、目的となるデータを探して得る方法です。
01 : Dim objDOM, rtResult 02 : 03 : Set objDOM = WScript.CreateObject("MSXML2.DOMDocument") 04 : rtResult = objDOM.load("Sample.xml") 04': '文字列データから取得する場合は、以下のとおり 04': 'なお、strXMLDocumentには、文字列としてXMLドキュメントが 04': '格納されていると仮定します。 05 : rtResult = objDOM.loadXML(strXMLDocument) 06 : If rtResult = True Then 07 : procDispDatas objDOM.childNodes 08 : End If 09 : Set objDOM = Nothing 10 : 11 : Sub procDispDatas(objNode) 12 : Dim obj 13 : For Each obj In objNode 14 : If obj.nodeType = 3 and obj.parentNode.nodeName = "title" Then 15 : MsgBox obj.parentNode.nodeName & " : " & obj.nodeValue 16 : End If 17 : If obj.hasChildNodes Then 18 : procDispDatas obj.childNodes 19 : End If 20 : Next 21 : End Sub
このコードは、前回紹介したものとほぼ同じです。このようにすることで文書全体を操作し、中に存在するデータを取得することができます。
取得したいデータは、必ずしも要素(Element)の中にある値であるとは限りません。属性(Attribute)を取得したいことがあるかもしれませんし、要素の名称かもしれません。そのような場合には、このコードを若干修正する必要があります。具体的には、14行目にあたる部分のコードです。この行では、どのようなデータを取得したいのかを指定しています。この例では、titleという要素の中にある値を取得するということで2つの条件が指定されています。このコードの根拠となるのが以下の表です。
DOMノードタイプ | 値 | 例 |
---|---|---|
NODE_ELEMENT | 1 | <artist type="band">The Offspring</artist> |
NODE_ATTRIBUTE | 2 | <artist type="band">The Offspring |
NODE_TEXT | 3 | <artist type="band">The Offspring |
NODE_PROCESSING_INSTRUCTION | 7 | <?xml version="1.0"?> |
NODE_DOCUMENT_TYPE | 10 | <!DOCTYPE compactdiscs SYSTEM "cds.dtd"> |
表1 ノードのタイプ |
この表に基づいてノードのタイプを指定することで取得したい内容を指定することができます。
「obj.nodeType = 3」と記述されているのは、上記の表のようにNODE_TEXTにあたる要素の中身を取得することを指定しています。また、もう1つの条件では、その要素の名称がtitleであるとの指定を行っています。つまり、ドキュメントの操作を行っているとき、アクティブになっている部分が「要素の値」であり、その要素名が「title」であったとき条件に一致するということです。そのため、メッセージボックスには、books配下のtitle要素の値のみが順に示されるようになっているわけです。
必要とするデータに応じて、このnodeTypeの設定を変更し、条件を設定することで必要とするデータへアクセスできるようになっていることが読み取れると思います。
このようにすると、ある特定の要素名で示された値を順に取得していくことができます。根幹要素(Root Element)から見て幾つかのデータが存在していて、それぞれの値を取得したいようなケースには、非常に有効な手段であると考えられます。
しかし、この方法で値の取得を行うと、ある特定の値を取得したいにもかかわらず、木構造を持っているXML文書の全体を操作することになってしまい、大きなドキュメントの中から探し出すような局面において最適な方法とはいえません。
そこで、今回紹介するのが、XPath式を用いた値の取得方法です。
Copyright © ITmedia, Inc. All Rights Reserved.