.NET Framework 3.5 になってから、色々な便利機能や名前空間が増えた。その中でも、お気に入りは、System.Xml.Linq 名前空間だ。XMLを扱うのに、非常に簡素で素敵な機能を提供してくれている。
まず、Document を考えなくても、Element 単位で考えられるところがよい。XElement は、たとえば、以下のように生成できる。
var x = new XElement("要素", new XAttribute("属性", "値"),
new XElement("子要素",
new XElement("孫要素")
)
);
ここでの x の中身は次のようになる。
<要素 属性="値">
<子要素>
<孫要素 />
</子要素>
</要素>
つまり、階層構造を真似て記述でき、引数を複数指定できるので、ありのままの XML を記述できる。また、Namespace を制御する XNamespace もシンプルで冴えている。string と同じような扱いをするように設計されており、コンストラクタがない。使い方は、
XNamespace n = "http://schema.wankuma.com/";
と、こんな感じ。XElement などに指定する時も、string にならって、
var x2 = new XElement( n + "要素名" );
と、こんな書き方である。しかし、n は string ではなく、あくまでも XNamespace。x2.Name は、string 型ではなく、名前空間とノード名が一つになった XName 型である。要素名を取り出すときは、x2.Name.LocalName となる。
System.Xml 名前空間は W3C に準拠して設計されたと思われるが、System.Xml.Linq 名前空間は、最適化された全く別の設計思想(つまりはLINQ)に基づいていると思う。