LinqでXMLデータからいろいろ取得

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(&quot;row&quot;)
                     select cell.Attribute(&quot;id&quot;)
                     ;

        int counter = 0;
        foreach (var element in result)
        {
            Console.WriteLine(&quot;U.S.S.エンタープライズDの指揮権:{0}番目&quot;, element.Value);

            // Cellの値を抜き出す
            var cellValue = from cell in xml.Descendants(&quot;cell&quot;)
                         where cell.Parent.Attribute(&quot;id&quot;).Value == element.Value
                         select cell;
            foreach (var attribute in cellValue)
            {
                Console.WriteLine(&quot;cell value:{0}&quot;,attribute.Value);
            }

            counter++;
        }
    }
}

[/sourcecode]

あらかじめ定数で定義したXMLデータからid属性とcellの値を取得して列挙しています。300くらいのデータで行ってみても一瞬でしたのでパフォーマンス的にもWebAPIとして利用する場合問題ないと思います。(そもそもWebAPIで利用する場合大量のデータを受け渡ししないと思うので…。)

EF4をいじりだしてからLinqにはすっかりお世話になっていますが、とても便利ですね。

そういえば、プログラミングC#をずんずん読んでいるのですが、第5版と比べて結構いろいろと変更されています。XMLについてはほとんど変わっていませんでした、、、