かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

XLinqを試す

XMLに対してもLINQ出来るらしいよ。
とりあえずXMLが無いと始まらないから適当にXMLをでっちあげてみた。

Employees.xml

<?xml version="1.0" encoding="utf-8" ?>

<Employees>
	<Employee>
		<ID>1</ID>
		<Name>太郎</Name>
	</Employee>
	<Employee>
		<ID>2</ID>
		<Name>二郎</Name>
	</Employee>
	<Employee>
		<ID>3</ID>
		<Name>三郎</Name>
	</Employee>
	<Employee>
		<ID>4</ID>
		<Name>四郎</Name>
	</Employee>
	<Employee>
		<ID>5</ID>
		<Name>五郎</Name>
	</Employee>
</Employees>

太郎さんから五郎さんまでの一覧だね。


さて、XMLに対してLINQを発行するにはSysem.Xml.Linq名前空間の中のクラスを使うらしいよ。

  • XDocument
  • XElement
  • XAttribute

あたりを使うみたい。
LINQには使えるけど、XSLTとかには対応してないらしいのでそういうときは今までどおりXmlDocumentを使うといいみたいだよ。

ってことで、IDが偶数の人だけを抜き出すサンプルを作ってみたよ。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.IO;

namespace XLinqSample
{
    class Program
    {
        static void Main(string[] args)
        {
            using (TextReader r = new StreamReader(File.OpenRead("Employees.xml")))
            {
                XDocument doc = XDocument.Load(r);
                var emps = from emp in doc.Descendants("Employee")
                           let id = int.Parse(emp.Element("ID").Value)
                           where id % 2 == 0
                           let name = emp.Element("Name").Value
                           select new
                                  { 
                                      ID = id,
                                      Name = name 
                                  };
                foreach (var emp in emps)
                {
                    Console.WriteLine(emp);
                }
            }
        }
    }
}

実行結果

{ ID = 2, Name = 二郎 }
{ ID = 4, Name = 四郎 }


初めて使ってるのはlet句くらいかな。
何か変数を作れるみたい。where句内に複雑なことを色々書くよりはletでやってしまってwhere句で使うのが読みやすくなりそうだよ。
クエリの戻りは匿名クラスにしてみたよ。
そっちのほうがインテリセンス効いてXElementを返すより扱いやすいからね。


今までは、LINQを感覚で使ってきたけど正しい書き方をリファレンスとにらめっこしながら覚えたほうがよさそうだね。
時間があったらやってみよ。