LINQ to XMLで抽出と並び替え
※この投稿はMicrosoft Visual Studio 2008 Beta2で動作を確認しています。
LINQ to XMLということで、LINQはXML形式のデータを扱うこともできます。
たとえば次のようなプログラムで。
using System;
using System.Linq;
using System.Xml.Linq;
namespace LINQ3
{
class Program
{
static void Main(string[] args)
{
XElement People = XElement.Parse(
@"<People>
<Person>
<Name>オサダ トシヒロ</Name>
<Gender>1</Gender>
<Age>32</Age>
</Person>
<Person>
<Name>カネフジ タカエ</Name>
<Gender>2</Gender>
<Age>46</Age>
</Person>
<Person>
<Name>キョウゴク トシツグ</Name>
<Gender>1</Gender>
<Age>11</Age>
</Person>
<Person>
<Name>コウダ キミタカ</Name>
<Gender>1</Gender>
<Age>17</Age>
</Person>
<Person>
<Name>シモイズミ エイコ</Name>
<Gender>2</Gender>
<Age>13</Age>
</Person>
<Person>
<Name>センザイ シュウイチロウ</Name>
<Gender>1</Gender>
<Age>43</Age>
</Person>
<Person>
<Name>ソウリョウ ノリカズ</Name>
<Gender>1</Gender>
<Age>21</Age>
</Person>
<Person>
<Name>マツバネ タツコ</Name>
<Gender>2</Gender>
<Age>24</Age>
</Person>
<Person>
<Name>ミツジマ タカコ</Name>
<Gender>2</Gender>
<Age>32</Age>
</Person>
<Person>
<Name>ヤハタ トシチカ</Name>
<Gender>1</Gender>
<Age>28</Age>
</Person>
</People>");
var query = from p in People.Descendants("Person")
where int.Parse(p.Element("Gender").Value) == 1 && int.Parse(p.Element("Age").Value) >= 20
orderby int.Parse(p.Element("Age").Value)
select p;
foreach (var item in query)
{
Console.WriteLine("名前={0}, 年齢={1}", item.Element("Name").Value, item.Element("Age").Value);
}
Console.Read();
}
}
}
LINQでXMLを扱うためにはいくつか注意しないといけないところがあります。
- "using System.Xml.Linq; "という記述を追加しておきましょう。
- XMLデータはXElementクラスに格納します。
- LINQの対象となるのは、XElementからDescendantsメソッドで取り出したデータです。
- 各Elementの値(Value)は文字列なので、適切な型にキャストしましょう。
LINQプログラムの基本的な部分はObjectを対象としたときとXMLを対象としたときで変化はありません。
当然、次のように拡張メソッド形式での記述も利用できます。
var query = People.Descendants("Person")
.Where(p => int.Parse(p.Element("Gender").Value) == 1 && int.Parse(p.Element("Age").Value) >= 20)
.OrderBy(p => int.Parse(p.Element("Age").Value));
実行結果もまったく同じです。
#実行結果が同じになるようにプログラム組んでるんだから当然ですけどね。