いろいろ備忘録日記

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

Linq入門記-67 (LINQ to XML, 要素の置換, ReplaceWith, ReplaceNodes, ReplaceAll)

LINQ to XMLでの要素の置換について.

過去の内容は以下から見れます。よろしければご参照くださいませ。


XElementには、要素の置換を行うためのメソッドがいくつか存在します。

ReplaceWith(object)
ReplaceWith(object[])
ReplaceNodes(object)
ReplaceNodes(object[])
ReplaceAll(object)
ReplaceAll(object[])


元定義は以下のようになっています。

XNode.ReplaceWith(object)
XContainer.ReplaceNodes(object)
XElement.ReplaceAll(object)


ReplaceAllメソッドは、属性まで削除する点に注意。
逆にReplaceNodesメソッドは、子要素を置換しますが、属性は削除しません。


以下、サンプルです。
引数がobject[]となっているものは割愛してます。

  #region LinqSamples-63
  /// <summary>
  /// LINQ to XMLのサンプルです.
  /// </summary>
  /// <remarks>
  /// 要素置換系メソッドのサンプルです.
  /// </remarks>
  public class LinqSamples63 : IExecutable
  {
    public void Execute()
    {
      //
      // ReplaceWith(object)
      //   現在の要素を指定した要素で置き換える.
      //   
      var root = BuildSampleXml();
      var elem = root.Descendants("Value").First();
      
      elem.ReplaceWith(new XElement("Value2", "replaced"));
      
      Console.WriteLine(root);
      Console.WriteLine("=====================================");
      
      //
      // ReplaceNodes(object)
      //   現在の要素の子ノードを指定された要素で置き換える.
      //   このメソッドはスナップショットセマンティクスという方法で置換処理を行う。
      //   スナップショットセマンティクスを用いている場合、置換前に事前に置き換える内容のコピーを
      //   作成してから、置換処理を行うため、現在の要素の状態を元に置換処理を実装することができる。
      //   (例: LINQ to XMLを利用して、現在の要素内容をクエリし、その結果を置換後として利用する。)
      //
      //   尚、このメソッドは属性を削除しない.
      //
      root = BuildSampleXml();
      elem = root.Elements("Child").First();
      
      elem.Add
        (
          from   x in Enumerable.Range(1, 5)
          select new XElement("Value", x)
        );
      
      elem.ReplaceNodes
        (
          from   e in elem.Elements()
          where  ToInt(e.Value) >= 3
          select e
        );
      
      Console.WriteLine(root);
      Console.WriteLine("=====================================");
      
      //
      // ReplaceAll(object)
      //   現在の要素の子ノードと属性を削除し、指定された要素で置き換える.
      //   このメソッドは、スナップショットセマンティクスという方法で置換処理を行う。
      //   スナップショットセマンティクスを用いている場合、置換前に事前に置き換える内容のコピーを
      //   作成してから、置換処理を行うため、現在の要素の状態を元に置換処理を実装することができる。
      //   (例: LINQ to XMLを利用して、現在の要素内容をクエリし、その結果を置換後として利用する。)
      //
      //   尚、このメソッドは属性を削除するので利用時には注意が必要。
      //
      root = BuildSampleXml();
      elem = root.Elements("Child").First();
      
      elem.Add
        (
          from   x in Enumerable.Range(1, 5)
          select new XElement("Value", x)
        );
      
      elem.ReplaceAll
        (
          from   e in elem.Elements()
          where  ToInt(e.Value) >= 3
          select e
        );
      
      Console.WriteLine(root);
      Console.WriteLine("=====================================");
    }
    
    int ToInt(string value)
    {
      int tmp;
      if (!int.TryParse(value, out tmp))
      {
        return -1;
      }
      
      return tmp;
    }
    
    XElement BuildSampleXml()
    {
      return XElement.Parse("<Root><Child Id=\"100\"><Value>hoge</Value></Child></Root>");
    }
  }
  #endregion

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

  
    
      replaced
    
  
  =====================================
  
    
      3
      4
      5
    
  
  =====================================
  
    
      3
      4
      5
    
  
  =====================================


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

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

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