プログラム

C#プログラミングレッスン

C#での .NETプログラミングを易しく丁寧に解説するメールマガジンです。「C#プログラミング・レッスン」で、.NETプログラミングをマスターしましょう。

全て表示する >

【C#プログラミングレッスン】 No.193-LINQ to XML 簡単なクエリ(1)

2009/01/27


■━ [C#プログラミングレッスン] ━━━━━━━━━━━━━ No.193 ━□
  
   「LINQ to XML編」 -- 簡単なクエリ
                                                         by Gushwell  
□━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━■

読者の皆さん、こんにちは。
早いもので2009年も1か月が経とうとしています。
皆さんは、2009年は、どんな目標を経てたでしょうか。
私は、Gushwellとしての目標は、あまり変わり映えしないですが、
 1.当メルマガを1年間継続する。
 2.Blog(http://blog.livedoor.jp/gushwell/)を継続する。
という2つの「継続」を目標としました。

さて、今回から、LINQ to XML編の開始です。

LINQ to XML は、XML操作のための.NET Frameworkの新しいインターフェース
です。ドキュメント オブジェクト モデル (DOM) のメモリ内ドキュメント変
更機能を備え、LINQ クエリ式をサポートしており、とても扱いやすい技術で
す。DOMでつまづいた方も、LINQ to XMLならば、より短時間で習得することが
できると思います。

■□ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
■□ サンプルXMLファイル

まずは、この連載であつかうXMLファイルを示します。
なお、このファイルは、http://gushwell.ifdef.jp/mailmag/sample.xmlにも
掲載してあります。

<?xml version="1.0" encoding="utf-8" ?>
<books>
    <book isbn="978-4873112213">
        <title>XML Hacks</title>
        <publisher>Oreilly</publisher>
        <authers>
            <auther>Michael Fitzgerald</auther>
        </authers>
        <price>3360</price>
    </book>
    <book isbn="978-0596516109">
        <title>C# CookBook</title>
        <publisher>Oreilly</publisher>
        <authers>
            <auther>Jay Hilyard</auther>
            <auther>Stephen Teilhet</auther>
        </authers>
        <price>5200</price>
    </book>
    <book isbn="978-0596527730">
        <title>C# 3.0 Design Patterns</title>
        <publisher>Oreilly</publisher>
        <authers>
            <auther>Judith Bishop</auther>
        </authers>
        <price>4200</price>
    </book>
    <book isbn="978-1933988160">
        <title>Linq in Action</title>
        <publisher>Manning Pubns</publisher>
        <authers>
            <auther>Fabrice Marguerie</auther>
            <auther>Steve Eichert</auther>
            <auther>Jim Wooley</auther>
        </authers>
        <price>4630</price>
    </book>
    <book isbn="978-0596100506">
        <title>Xml Pocket Reference</title>
        <publisher>Oreilly</publisher>
        <authers>
            <auther>Simon St. Laurent</auther>
            <auther>Michael Fitzgerald</auther>
        </authers>
        <price>1160</price>
    </book>
</books>

このXMLファイルを使った簡単な例をしめすことで、LINQ to XMLについて理解
を深めていきたいと思います。

■□ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
■□ 特定の要素を取り出す

まずは、書籍のタイトルの一覧を表示するコードです。

  XDocument xdoc = XDocument.Load("sample.xml");
  foreach (var xbook in xdoc.Root.Elements()) {
      XElement xname = xbook.Element("title");
      Console.WriteLine(xname.Value);
  }

結果は、以下のようになります。

 XML Hacks
 C# CookBook
 C# 3.0 Design Patterns
 Linq in Action
 Xml Pocket Reference

このコードを簡単に説明します。
XDocumentクラスが、LInq to XMLで追加された、XMLドキュメントを表すクラ
スです。 
 ※LINQ to XMLは、System.Xml.Linq 名前空間内のクラスにより実現されて
   います
このXDocumentクラスのLoad staticメソッドを使い、XMLファイルをロードし、
Rootの直下にあるBook要素を foreach文で一つずつ取り出しています。
Rootが<Book>要素を、Elements()がその子要素の<Book>要素一覧を示していま
す。
それから、取り出した Book要素の子要素である title要素を Elementメソッ
ドで取り出し、その値である書籍名を表示しています。

■□ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
■□ クエリ式を使った例

でもこのコードはあまりLINQっぽくないですね。
今度は、LINQのクエリ式を使った例をお見せしましょう。

 XDocument xdoc = XDocument.Load("sample.xml");
 var query = from xbook in xdoc.Root.Elements()
             select xbook.Element("title").Value;
 foreach (var title in query)
      Console.WriteLine(title);

foreach文は、表示処理ですので、実際のtitle要素を取得している部分は、

 var query = from xbook in xdoc.Root.Elements()
             select xbook.Element("title").Value;

となります。この部分で、<book>要素を取り出し、その "title"の値を列挙し
ています。
lINQ to Objectと決定的に違うのは、各要素を変数名で指定できない点でしょ
う。Element("xxxxx")のように、タグ名を文字列で指定しなければなりません。
query変数には、そのtitle要素の値(文字列)が列挙されることになりますが、
LINQ to XMLにおいても、遅延評価が行われますので、実際に書籍名が取得さ
れるのは、foreach文の中ということになります。


───────────────────────────────────
『C#プログラミングレッスン』  (ぼぼ週刊)                             
───────────────────────────────────
 Published by Gushwell.                                               
   Copyright (C) 2004-2009 Gushwell All rights reserved.              
   Microsoft MVP - Visual C#(Apr 2005 - Mar 2009)                     
--------------------- Gushwell's Page --------------------------------
 窓際プログラマーの独り言  :http://blog.livedoor.jp/gushwell/        
 窓際プログラマーの読書三昧:http://gushwell.jugem.jp/                
 Gushwell's C# Programing Page:http://gushwell.ifdef.jp/             
 C#デザインパターン :                                                 
  『増補改訂版Java言語で学ぶデザインパターン入門 / 結城 浩(著)』      
   のサンプルコードをC#に移植したものを掲載しています。               
   移植後のコードの公開は、結城氏の了解を得ています。                 
   http://gushwell.ifdef.jp/dp/csdpindex.html                         
───────────────────────────────────

規約に同意してこのメルマガに登録/解除する

メルマガ情報

創刊日:2004-08-12  
最終発行日:  
発行周期:ほぼ週刊  
Score!: 非表示   

コメント一覧コメントを書く

この記事にコメントを書く

上の画像で表示されている文字を半角英数で入力してください。

※コメントの内容はこのページに公開されます。発行者さんだけが閲覧できるものではありません。 コメントの投稿時は投稿者規約への同意が必要です。

  • コメントはありません。