XPathを使って指定した属性値を持つノードを選択する - C#

XPath式を使って指定した属性値を持つノードを検索するコードを紹介します。

概要

XPath式を使って指定した属性値を持つノードを検索します。
指定した属性値を持つノードを検索する場合は次の書式を用います。
/(ノード名)[@(属性名)='(値)']

また、次の書式を利用するとルートノード以下にある(ノード名)という名前を持つノードすべてが選択対象となります。
//(ノード名)

下記の書式でも記述できます。
//(ノード名)[@(属性名)='(値)']

コード例

private void button10_Click(object sender, EventArgs e)
{
  XmlDocument xmlDocument = new XmlDocument();
  xmlDocument.Load(textBox1.Text);

  XmlNodeList nodeList = xmlDocument.SelectNodes(@"/root/node[@code='A002']");
  /*
  //下記XPath式はルートノード以下にあるnodeノードを対象とする
  XmlNodeList nodeList = xmlDocument.SelectNodes(@"//node[@code='A002']");
  */
  
  for (int i=0; i < nodeList.Count; i++) {
    textBox2.Text += "NodeType: " + nodeList[i].NodeType + "\r\n";
    textBox2.Text += "Name: " + nodeList[i].Name + "\r\n";
    textBox2.Text += "LocalName: " + nodeList[i].LocalName + "\r\n";
    textBox2.Text += "Value: " + nodeList[i].Value + "\r\n";
    textBox2.Text += "InnerText: " + nodeList[i].InnerText + "\r\n";
    textBox2.Text += "\r\n";
    if (nodeList[i].HasChildNodes == true) {
      for (int j=0; j < nodeList[i].ChildNodes.Count; j++) {
        textBox2.Text += "NodeType: " + nodeList[i].ChildNodes[j].NodeType + "\r\n";
        textBox2.Text += "Name: " + nodeList[i].ChildNodes[j].Name + "\r\n";
        textBox2.Text += "LocalName: " + nodeList[i].ChildNodes[j].LocalName + "\r\n";
        textBox2.Text += "Value: " + nodeList[i].ChildNodes[j].Value + "\r\n";
        textBox2.Text += "InnerText: " + nodeList[i].ChildNodes[j].InnerText + "\r\n";
      }
    }
    textBox2.Text += "\r\n";
  }
}

解説

XmlDocumentクラスのインスタンスを作成しXMLファイルを読み込みます。
  XmlDocument xmlDocument = new XmlDocument();
  xmlDocument.Load(textBox1.Text);

選択するノードのXPath式を与えてノードを選択します。
上記の例では /root/node のパスを持つノードで、"node"ノードの属性"code"が"A002"であるノードを選択するXPath式になります。
  XmlNodeList nodeList = xmlDocument.SelectNodes(@"/root/node[@code='A002']");

下記コードはルートノード以下にある、"node"ノードで属性"code"が"A002"であるノードを選択するXPath式です。
  XmlNodeList nodeList = xmlDocument.SelectNodes(@"//node[@code='A002']");

以下選択したノードの内容をtextBox2に表示するコードとなります。

入力XMLファイル

<?xml version="1.0" encoding="UTF-8"?>  
<root>  
  <node code="A001"> 
    <data type="text">データ1です</data>  
  </node> 
  <node code="A002">  
    <data type="text">データ2です</data>  
  </node> 
  <node code="A003"> 
    <data type="text">データ3です</data>  
  </node> 
</root>

実行結果

codeの属性値がA002である2番目のノードを選択して表示する結果が得られます。

NodeType: Element
Name: node
LocalName: node
Value: 
InnerText: データ2です

NodeType: Element
Name: data
LocalName: data
Value: 
InnerText: データ2です
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2011-01-16
iPentec all rights reserverd.