System.Xml.Linq のクラス群をみると構成が DOM に似ています。
しかしこれは DOM よりもはるかに柔軟です。(というか扱いやすい)
なぜかというとこんなことができるんです。
XName key = "key";
XDocument doc = XDocument.Load(@"D:\temp\test2.xml");
XElement documentElement = (XElement)doc.FirstNode;
IEnumerable<XElement> elements =
from item in documentElement.Elements("item")
where item.Attribute(key).Value.EndsWith("1")
select item;
XDocument anotherDoc = XDocument.Parse("<hoge/>");
XElement root = (XElement)anotherDoc.FirstNode;
root.Add(elements);
XElement newElm = new XElement("新規要素");
newElm.Value = "要素内容";
root.Add(newElm);
XAttribute attr = new XAttribute("属性", "属性値");
root.Add(attr);
Console.WriteLine(anotherDoc);
んで、これが結果。
<hoge 属性="属性値">
<item key="11">1-1</item>
<item key="21">2-1</item>
<item key="31">3-1</item>
<新規要素>要素内容</新規要素>
</hoge>
わかります?
これまである XML から要素を取り出して、別の XML に取り込もうと思ったら ImportNode やらしなければならなかったんですよ。
また XElement は普通に new できるので、要素の追加なども Create 系メソッドを使う必要がありません。
要素用、属性用とメソッドを使い分ける必要もありません。
XElement.Add の引数が XNode じゃなくて object なのは、サンプルでやってるように IEnumerable<XElement> も取り込めるようになんだろう、便利だ。
ほかの使い方もできるのだろうか?