LINQとXMLの基礎
About
LINQはC#.Netの特徴的な機能の一つで、データベースコマンド(SQL文)をソースコード上に似たような記述で実現する機能です。これはXMLデータベースに対しても対応されています。データベースとしてのあつかいを除いても、.Netの標準的な機能をからXMLを利用するよりも、LINQの関連機能をあつかう方が、楽にXMLデータを利用でき(る場合があり)ます。
ここではLINQを利用して、XMLの最も基本的な入出力について解説しています。一度に複数の解説を避けるため、LINQの本質的な操作である、SQLの記述についてはここではあつかいません。
- ConsoleApplication1_LinqAndXmlTest.zip
- VisualStudio2012a
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);