Top > Programming > .NetFramework > LINQ > LINQandXML
Last-modified: Mon, 18 Mar 2013 17:16:47 JST
Counter:2610 Today:1 Yesterday:1 Online:9
このエントリーをはてなブックマークに追加

LINQとXMLの基礎

About

LINQはC#.Netの特徴的な機能の一つで、データベースコマンド(SQL文)をソースコード上に似たような記述で実現する機能です。これはXMLデータベースに対しても対応されています。データベースとしてのあつかいを除いても、.Netの標準的な機能をからXMLを利用するよりも、LINQの関連機能をあつかう方が、楽にXMLデータを利用でき(る場合があり)ます。

ここではLINQを利用して、XMLの最も基本的な入出力について解説しています。一度に複数の解説を避けるため、LINQの本質的な操作である、SQLの記述についてはここではあつかいません。

HowTo

LINQを利用する場合は名前空間"System.Xml.Linq;"を参照しておきます。

LINQを利用したXMLの出力

LINQを利用することでDOMツリーを操作するよりも簡単にXMLテキストを出力することができます。ここであつかうサンプルコードは次のようなXMLテキストを出力します。例として人員をあつかうためのXMLを用意しました。

<Members xmlns="test">
  <Member>一郎</Member>
  <Member>二郎</Member>
  <Member>三郎</Member>
</Members>

まず出力する名前空間を定義しておきます(下に補足項目を用意しました)。名前空間はXNamespace型で定義します。この名前空間が与えられるElment(要素)の親(Elemnt)が同じ名前空間を持つ場合は、XMLテキスト出力時にその名前空間が省略されます。

あとはソースコードをみたままです。まずXMLツリーの土台を作ります。XMLツリーの土台はXElementとして生成します。そこに、子となるElementを追加していくことでXMLツリーをどんどん大きくしていきます。XMLの要素Elementも、そのままXElementです。

XElementのコンストラクタは"(要素名,要素/の値)"となっています。第1引数にはXMLタグの中に記載される要素の名前、第2引数にはその値が与えられます。また第2引数以降の引数に新たにXElementを与えていくことも可能です(際限なしに)。

  • <要素名>値</要素名>

要素名には任意の名前空間、つまりXNamespaceを指定することができます。指定方法はソースコードの通りです。また先の通り、指定した名前空間は、親となる要素が同じ名前空間を持つ場合には出力時省略されます。ここではコンソール出力とファイル出力の例を2通り示していますが、出力結果は何れも同じで、先の通りとなります。

            //名前空間
            XNamespace nspace = "test";

            //実際のツリーを生成する
            XElement xmltree =
                new XElement(nspace + "Members",
                    new XElement(nspace + "Member", "一郎"),
                    new XElement(nspace + "Member", "二郎")
            );

            //1人分のデータを追加する
            xmltree.Add(new XElement(nspace + "Member", "三郎"));

            //コンソール出力
            Console.WriteLine(xmltree.ToString());

            //ファイル出力
            FileStream fileStream = new FileStream("test.xml", FileMode.Create);
            xmltree.Save(fileStream);
            fileStream.Close();

名前空間はXMLの構造を保つために必ずしも必要な処理ではありませんが、同じ名前のElement(要素)が複数あつかわれる時、それぞれを別の種類のElementとしてあつかうことができます。例えば、ここでは人員をあつかうためにroot(要素)を"Members"としていますが、これがどこの人員であるかを名前空間で識別するように、"名前空間チームA"、"名前空間チームB"とすることができます。設計上これは正しくないあつかい方かもしれませんが。

LINQを利用したXMLの読み取り

XMLテキストをファイルから、通信から文字列として与えられた場合に、それをXMLデータ、すなわちXElementとしてあつかえるように(デシリアライズ・デコード)します。ここではあらかじめ文字列としてXMLテキストを用意しています。名前空間Linqの提供するXElement型のデータにするのは極めて簡単で、XElement.Parse(string)メソッドを利用するだけで完了します。

            //読み取るXMLテキスト
            string xmldoc = "<Members xmlns=\"test\"><Member>一郎</Member><Member>二郎</Member><Member>三郎</Member></Members>";

            //読み取りとLINQであつかえるXML化
            XElement doc = XElement.Parse(xmldoc);

            //出力して確認する
            Console.WriteLine(doc);

Reference