XMLデータを扱う場合にXMLTextReaderを使用してごにょごにょしていたのですが、どうにもすっきりしませんでした。ちょっとプログラミングC# 第6版をめくってみるとどうやらLinqでXMLを操作できるらしいということでしたので早速試してみました。
試してみたのですが、あまりにもあっけなくうまくいったのでコードを載せてみます。
[sourcecode language="csharp"]
class Program
{
static void Main(string[] args)
{
const string data = @"
<?xml version=""1.0""?>
<rows>
<row id='1'>
<cell>ジャンリュック・ピカード</cell>
<cell>艦長</cell>
<cell>大佐</cell>
</row>
<row id='2'>
<cell>ウイリアム・T・ライカー</cell>
<cell>副長</cell>
<cell>中佐</cell>
</row>
<row id='3'>
<cell>データ</cell>
<cell>第二副長</cell>
<cell>少佐</cell>
</row>
<row id='4'>
<cell>ビバリー・クラッシャー</cell>
<cell>医療主任士官</cell>
<cell>中佐</cell>
</row>
<row id='5'>
<cell>ディアナ・トロイ</cell>
<cell>カウンセラー</cell>
<cell>中佐</cell>
</row>
</rows>";
var xml = XElement.Parse(data);
// idを抜き出す
var result = from cell in xml.Descendants("row")
select cell.Attribute("id")
;
int counter = 0;
foreach (var element in result)
{
Console.WriteLine("U.S.S.エンタープライズDの指揮権:{0}番目", element.Value);
// Cellの値を抜き出す
var cellValue = from cell in xml.Descendants("cell")
where cell.Parent.Attribute("id").Value == element.Value
select cell;
foreach (var attribute in cellValue)
{
Console.WriteLine("cell value:{0}",attribute.Value);
}
counter++;
}
}
}
[/sourcecode]
あらかじめ定数で定義したXMLデータからid属性とcellの値を取得して列挙しています。300くらいのデータで行ってみても一瞬でしたのでパフォーマンス的にもWebAPIとして利用する場合問題ないと思います。(そもそもWebAPIで利用する場合大量のデータを受け渡ししないと思うので…。)
EF4をいじりだしてからLinqにはすっかりお世話になっていますが、とても便利ですね。
そういえば、プログラミングC#をずんずん読んでいるのですが、第5版と比べて結構いろいろと変更されています。XMLについてはほとんど変わっていませんでした、、、