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