|
|
連載:[完全版]究極のC#プログラミング
Chapter18 LINQ to XML
川俣 晶
2010/05/06 |
|
|
18.6 単純化されたXML文書生成
LINQ to XMLの恩恵は、何もクエリだけで発揮されるわけではない。上記リスト18.6のサンプルコードは、単にXML文書を生成するだけのプログラムだが、DOMを使って正攻法でXML文書を構築する方法と比較して、大幅なソースコードの簡素化が図られている。
実際に次のリスト18.7と比較すると、いかに改善されているかがわかるだろう。
using System;
using System.Xml;
class Program
{
static void Main(string[] args)
{
string ns = "http://www.piedey.co.jp/example/linqtoxml200811";
var doc = new XmlDocument();
var person = doc.CreateElement("person",ns);
doc.AppendChild( person );
var name = doc.CreateElement("name",ns);
name.InnerText = "Wong Fei Fong";
person.AppendChild( name );
var age = doc.CreateElement("age",ns);
age.InnerText = "18";
person.AppendChild( age );
var address = doc.CreateElement("address",ns);
address.InnerText = "Village of Lahan";
person.AppendChild( address );
Console.WriteLine(doc.OuterXml);
}
}
|
|
リスト18.7 DOMにより正攻法で記述した例 |
<person xmlns="http://www.piedey.co.jp/example/linqtoxml200811"><name>Wong FeiFong</name><age>18</age><address>Village of Lahan</address></person>
|
|
リスト18.7の実行結果 |
これを見て、嫌になった読者もいると思うし、自分ならこのようなコードは書かないと思った読者もいると思う。もちろん、筆者も通常の開発であればこのようなコードは書かない。
ちなみに、どのような仕掛けで簡潔なXML文書の生成ができるのか、構造を簡単に紹介しておこう。
XElementクラスのコンストラクタはいくつかのバリエーションがあるが、person要素生成で使用しているもの(リスト18.6の「new XElement(ex + "person",……」の部分)は任意の数の引数を受け取ることができる。最初の引数は名前だが2番目以降は、属性(XAttribute)、要素(XElement)、テキスト(string)をいくつでも並べることができ、それらが順に子ノードとして生成される。
これにより、コンストラクタの引数に列挙するだけで、必要な子ノードをすべてまとめて生成することができる。もちろん、それらの子ノードのコンストラクタも同じように子ノードを列挙できるので、たった1回ネストした形でコンストラクタ実行式を書けば、それだけで任意のXML文書を生成させることができる。
このような工夫のおかげで、C# 3.0はECMAScriptやVisual Basicと異なり、XML専用の構文を導入していないにもかかわらず、従来とは比較にならないほど簡潔にXML文書を処理するコードを記述できる。
Insider.NET 記事ランキング
本日
月間