久しぶりにシンプルにVisual Studio 2008でコンソールアプリでお試し。
今日試すのは、LINQ to XMLだ!
仕事でどれくらい使うかは未知数というか0に限りなく近いけど、お試しをしてみる。
とりあえず、お試しようのプロジェクトを作成。名前はLINQtoXMLSampleにした。
もちろんコンソールアプリケーションで。
とりあえず、元になるXMLが必要になるけど、今回は練習ということでプログラム内にハードコーディングした。
static readonly string EMPS = @"
<Emps>
<Emp id='1'>
<Name>田中 太郎</Name>
<DeptId>1</DeptId>
</Emp>
<Emp id='2'>
<Name>田中 次郎</Name>
<DeptId>1</DeptId>
</Emp>
<Emp id='3'>
<Name>田中 三郎</Name>
<DeptId>2</DeptId>
</Emp>
</Emps>
";
static readonly string DEPTS = @"
<Depts>
<Dept id='1'>
<Name>人事部</Name>
</Dept>
<Dept id='2'>
<Name>総務部</Name>
</Dept>
</Depts>
";
従業員データをあらわすEmpsと部署データをあらわすDeptsというXMLになる。EmpsのDeptIdとDeptのid属性で紐づいてるっていう寸法だ。XMLなのに、こういうRDBみたいなデータの持たせ方するのはどうなの?という話もあるだろうけど、今回はJOINするのが目的なので、こういう形にしてみた。
ということで、このEmpsとDeptsというXMLを結合して、人の名前と、その人が所属してる部署名を抽出して抜き出してみようと思う。
LINQのjoinは、「join hoge in hogehoges on xxxxxx equals yyyyyy」みたいな雰囲気でかくっぽい。
ということでざっくり書いてみた。
// XMLをパース
var emps = XElement.Parse(EMPS);
var depts = XElement.Parse(DEPTS);
// EmpタグのDeptIdとDeptのid属性でjoinしてEmpのNameとDeptのNameを抽出
var results = from e in emps.Elements("Emp")
join d in depts.Elements("Dept") on e.Element("DeptId").Value equals d.Attribute("id").Value
select new { Name = e.Element("Name").Value, DeptName = d.Element("Name").Value };
// 結果を表示
foreach (var result in results)
{
Console.WriteLine(result);
}
これを実行すると、下のような結果になる。
{ Name = 田中 太郎, DeptName = 人事部 }
{ Name = 田中 次郎, DeptName = 人事部 }
{ Name = 田中 三郎, DeptName = 総務部 }
うまく、いった。いい感じだ?