読者です 読者をやめる 読者になる 読者になる

いろいろ備忘録日記

主に .NET 絡みのメモを公開しています。

Linq入門記-64 (LINQ to XML, 要素の追加, Add, AddAfterSelf, AddBeforeSelf, AddFirst)

C# Linq

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

実行すると以下のようになります。

  
    
      hoge
    
    hehe
  
  =====================================
  [ERROR] 親がありません。
  =====================================
  
    
      hoge
    
    AfterSelf
  
  =====================================
  [ERROR] 親がありません。
  =====================================
  
    BeforeSelf
    
      hoge
    
  
  =====================================
  
    First
    
      hoge
    
  
  =====================================
  
    
      First
      hoge
    
  
  =====================================


以下、参考リソースです.

================================
過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。