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