タグ:

XPathを使用せずにノードを取得する

サンプルコード

Import System.Xml

Sub Main()

  Dim xDoc As New XmlDocument 'DOMを格納するための変数の宣言
  xDoc.Load("C:\sample.xml") 'xmlの読み込み

  Dim item As Xml.XmlElement = xDoc.GetElementById("id1") 'idが"id1"となっているElementを取得する

  Dim nodes As XmlNodeList '複数のノードを格納できる変数
  nodes = xDoc.GetElementsByTagName("item") '"item"という名前のElementをすべて取得する
End Sub

GetElementById ではidが等しい一つのElementを取得します。評価対象はDTDまたはスキーマでIDと定義されている'ID'属性のみです。つまりこの方法で取得するにはID定義が必要となります。


XPathを使用してノードを取得する

サンプルコード

Import System.Xml

Sub Main()

  Dim xDoc As New XmlDocument 'DOMを格納するための変数の宣言
  xDoc.Load("C:\sample.xml") 'xmlの読み込み

  Dim node as XmlNode = xDoc.DocumentElement.SelectSingleNode("//*[(@Id='id1')]") '"Id"属性の値が"id1"のElementを取得する

  Dim nodes As Xml.XmlNodeList '複数のノードを格納できる変数
  nodes = xDoc.DocumentElement.SelectNodes("//item") '"item"という名前のElementをすべて取得する
End Sub

SelectNodes,SelectSingleNodeではXPath式を使用できます。

XPath式を使用することでID定義をしていなくても'ID'属性を評価対象のノードを取得できます。また、ID属性ではない属性の値やエレメントの値等でもノードの取得が可能です。

例:Xpath式

  • "./name" or "name"

    現在のノードからみた"name"子ノード

  • "//name"

    "name"子孫ノード

  • "../person"

    親ノードの子ノード=兄弟ノードの"person"ノード

  • "//name/first-name"

    "name"要素の子ノードの"first-name" ノード

  • "//*[@id]"

    エレメントの名前は何でもよくて、"id"属性を持つノード

  • "//homepage[@title]"

    エレメントの名前が"homepege"で、"title"属性を持つノード

  • "//parson[ @id>'1']"

    エレメントの名前が"parson"で、"id"属性の値が1より大きいノード

  • "//parson[ @id=@id2]"

    エレメントの名前が"parson"で、属性"id"と"id2"の値が同じノード

  • "//*[ @last-name='Mike']"

    属性"last-name"の値が"Mike"であるノード(エレメントの名前は何でもよい)

  • "//parson[ @id='1']/name"

    エレメントの名前が"parson"で、属性"id"の値が"1"であるノードの"name"子ノード

"//"は子孫ノードすべてという意味です。