かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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を感覚で使ってきたけど正しい書き方をリファレンスとにらめっこしながら覚えたほうがよさそうだね。
時間があったらやってみよ。