LINQ to XMLでの要素の追加について.
過去の内容は以下から見れます。よろしければご参照くださいませ。
XElementには、要素の追加を行うためのメソッドがいくつか存在します。
Add(object) AddAfterSelf(object) AddBeforeSelf(object) AddFirst(object)
でも、実際はXElement独自のメソッドは一つもなくて
元定義は以下のようになっています。
XContainer.Add(object) XNode.AddAfterSelf(object) XNode.AddBeforeSelf(object) XContainer.AddFirst(object)
上記のメソッドは、どれも object を受け取るオーバーロードも持っています。
一つ追加するか一気に複数追加するかの違いです。
以下、サンプルです。
object のオーバーロードに関しては割愛しています。
#region LinqSamples-60 /// <summary> /// LINQ to XMLのサンプルです. /// </summary> /// <remarks> /// 要素追加系メソッドのサンプルです. /// </remarks> public class LinqSamples60 : IExecutable { public void Execute() { // // Add(object) // 名前の通り、現在の要素に指定された要素を追加する. // 追加される位置は、その要素の末尾となる // var root = BuildSampleXml(); var newElem1 = new XElement("NewElement", "hehe"); root.Add(newElem1); Console.WriteLine(root); Console.WriteLine("====================================="); // // AddAfterSelf(object) // 現在の要素の後ろに、指定された要素を追加する. // 追加される位置は、自分自身の中ではなく外となる事に注意. // 尚、ルート要素に対して本メソッドを呼び出すと親が存在しないので // InvalidOperationExceptionが発生する. // (発生する例外がXmlExceptionでは無いことに注意) // root = BuildSampleXml(); var newElem4 = new XElement("AfterElement", "AfterSelf"); try { // ルート要素に対して、自身の後ろに要素を追加しようとするので // エラーとなる。XmlExceptionでは無いことに注意. root.AddAfterSelf(newElem4); Console.WriteLine(root); } catch (InvalidOperationException invalidEx) { Console.WriteLine("[ERROR] {0}", invalidEx.Message); } finally { Console.WriteLine("====================================="); } root.Elements().First().AddAfterSelf(newElem4); Console.WriteLine(root); Console.WriteLine("====================================="); // // AddBeforeSelf(object) // 現在の要素の前に、指定された要素を追加する. // 追加される位置は、自分自身の中ではなく外となる事に注意. // 尚、ルート要素に対して本メソッドを呼び出すと親が存在しないので // InvalidOperationExceptionが発生する. // (発生する例外がXmlExceptionでは無いことに注意) // root = BuildSampleXml(); var newElem5 = new XElement("BeforeElement", "BeforeSelf"); try { // ルート要素に対して、自身の前に要素を追加しようとするので // エラーとなる。XmlExceptionでは無いことに注意. root.AddBeforeSelf(newElem5); Console.WriteLine(root); } catch (InvalidOperationException invalidEx) { Console.WriteLine("[ERROR] {0}", invalidEx.Message); } finally { Console.WriteLine("====================================="); } root.Elements().First().AddBeforeSelf(newElem5); Console.WriteLine(root); Console.WriteLine("====================================="); // // AddFirst(object) // 現在要素の先頭子要素として、指定された要素を追加する. // 追加される位置は、自分自身の中となる。(先頭要素) // root = BuildSampleXml(); var newElem6 = new XElement("FirstElement", "First"); root.AddFirst(newElem6); Console.WriteLine(root); Console.WriteLine("====================================="); root = BuildSampleXml(); root.Elements().First().AddFirst(newElem6); Console.WriteLine(root); Console.WriteLine("====================================="); } XElement BuildSampleXml() { return new XElement("Root", new XElement("Child", new XAttribute("Id", 100), new XElement("Value", "hoge") ) ); } } #endregion
実行すると以下のようになります。
===================================== [ERROR] 親がありません。 ===================================== hoge hehe ===================================== [ERROR] 親がありません。 ===================================== hoge AfterSelf ===================================== BeforeSelf hoge ===================================== First hoge ===================================== First hoge
以下、参考リソースです.
- XContainer.Add メソッド (Object)
- XNode.AddAfterSelf メソッド (Object)
- XNode.AddBeforeSelf メソッド (Object)
- XContainer.AddFirst メソッド (Object)
================================
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場