連載:[完全版]究極の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文書を処理するコードを記述できる。


 INDEX
  [完全版]究極のC#プログラミング
  Chapter18 LINQ to XML
    1.18.1 LINQプロバイダーを導入する別の理由
    2.18.2 XML最大の災厄
    3.18.3 DOMの憂鬱
    4.18.4 E4XのXMLサポート
    5.18.5 LINQ to XMLというブレークスルー
  6.18.6 単純化されたXML文書生成
    7.18.7 まとめ―ストレスレスなXMLの扱い/練習問題
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間