LINQ To XML を利用したXMLドキュメント検索 - C#

LINQ To XMLを用いてシンプルなXMLドキュメントを検索をします。

入力XMLデータ

はじめに、今回入力するXMLデータを紹介します。
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <Items>
    <Item code="PAA-03291">
      <Name>Penguin Cookie</Name>
      <Price>250</Price>
    </Item>
    <Item code="PAA-05180">
      <Name>Whale Candy</Name>
      <Price>80</Price>
    </Item>
  </Items>
</root>

コード(周辺コード)

OpenFileDialogを開き選択したファイルのファイル名をtextBox1に入力するコードです。
private void button1_Click(object sender, EventArgs e)
{
  if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
    textBox1.Text += openFileDialog1.FileName;
  }
}

Elementsメソッドを用いたシンプルな検索

コード

private void button3_Click(object sender, EventArgs e)
{
  XElement dataElem = XElement.Load(textBox1.Text);

  IEnumerable<string> partsName = from item 
    in dataElem.Elements("Items").Elements("Item").Elements("Name")
    select item.Value;
  
  foreach (string name in partsName) {
    textBox2.Text += name + "\r\n";
  }
  textBox2.Text += "---------- \r\n";
}

実行結果 (textBox2)

Penguin Cookie
Whale Candy
---------- 

解説

XElementクラスを宣言し、LoadメソッドでXMLファイルを読み込みます。
  XElement dataElem = XElement.Load(textBox1.Text);

Linq文を記述します。XElement.Elements(ノード名)でルートノードの子ノードにある、"Items"ノードを検索します。続けてElements("Item")メソッドにて、"Items"ノードのさらに子ノードにある"Item"ノード、さらにその子ノードの"Name"ノードがあるか検索します。
検索にマッチしたノードの値(内部テキスト)を選択値として partsName IEnumratableに代入します。
 IEnumerable<string> partsName = from item 
   in dataElem.Elements("Items").Elements("Item").Elements("Name")
   select item.Value;

foreachループでpartsNameのデータにアクセスしますpartsCodeはstring型のIEnumratableですのでそのままの値をTextBox2に表示できます。partsNameはNameノードの値が入っているため、実行結果として"Penguin Cookie"といった文字列が出力されます。
 foreach (string name in partsName) {
   textBox2.Text += name +"\r\n";
 }

Descendantsメソッドを用いたシンプルな検索

コード

private void button2_Click(object sender, EventArgs e)
{
  XElement dataElem = XElement.Load(textBox1.Text);
      
  IEnumerable<string> partsCode = from item in dataElem.Descendants("Item")
    select (string)item.Attribute("code");
  
  foreach (string code in partsCode) {
    textBox2.Text += code +"\r\n";
  }
  textBox2.Text += "---------- \r\n";
}

実行結果 (textBox2)

PAA-03291
PAA-05180
---------- 

解説

XElementクラスを宣言し、LoadメソッドでXMLファイルを読み込みます。
  XElement dataElem = XElement.Load(textBox1.Text);

Linq文を記述します。XElement.Descendants(ノード名)でルートノード以下にある"Item"ノードを検索します。検索にマッチしたノードの"code"属性値を選択値として partsCode IEnumratableに代入します。
  IEnumerable<string> partsCode = from item in dataElem.Descendants("Item")
    select (string)item.Attribute("code");

foreachループでpartsCodeのデータにアクセスしますpartsCodeはstring型のIEnumratableですのでそのままの値をTextBox2に表示できます。partsCodeはItemノードのcode属性の値が入っているため、実行結果として"PAA-03291"といった文字列が出力されます。
  foreach (string code in partsCode) {
    textBox2.Text += code +"\r\n";
  }

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2021-08-24
作成日: 2011-01-11
iPentec all rights reserverd.