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

いろいろ備忘録日記

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

Linq入門記-66 (LINQ to XML, 要素の削除, Remove, RemoveAll, RemoveNodes, SetElementValue)

C# Linq

LINQ to XMLでの要素の削除について.

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


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

Remove()
RemoveAll()
RemoveNodes()
SetElementValue(XName, object)


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

XNode.Remove()
XElement.RemoveAll()
XContainer.RemoveNodes()
XElement.SetElementValue(XName, object)


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


上記のメソッドの中でSetElementValueメソッドのみが
ちょっと特殊です。このメソッドは、自分自身ではなく
子要素の値を更新します。その際

  • 要素が存在する場合は、その要素の値を更新
  • 要素が存在しない場合は、新たに要素を作成
  • 値にnullを設定した場合は、子要素を削除

という動きになります。


以下、サンプルです。

  #region LinqSamples-62
  /// <summary>
  /// LINQ to XMLのサンプルです.
  /// </summary>
  /// <remarks>
  /// 要素削除系メソッドのサンプルです.
  /// </remarks>
  public class LinqSamples62 : IExecutable
  {
    public void Execute()
    {
      //
      // Remove()
      //   現在の要素をXMLツリーより削除する.
      //
      var root = BuildSampleXml();
      var elem = root.Descendants("Value").First();
      
      elem.Remove();
      
      Console.WriteLine(root);
      Console.WriteLine("=====================================");
      
      //
      // RemoveAll()
      //   現在の要素から子ノード及び属性を削除する.
      //   属性まで削除される点に注意。
      //
      root = BuildSampleXml();
      elem = root.Elements("Child").First();
      
      elem.RemoveAll();
      
      Console.WriteLine(root);
      Console.WriteLine("=====================================");
      
      //
      // RemoveNodes()
      //   現在の要素から子ノードを削除する
      //   RemoveAllメソッドと違い、属性は削除されない
      //
      root = BuildSampleXml();
      elem = root.Elements("Child").First();
      
      elem.RemoveNodes();
      
      Console.WriteLine(root);
      Console.WriteLine("=====================================");
      
      //
      // SetElementValue(XName, object)
      //   本来は、子要素の値を設定するためのメソッドであるが
      //   要素の値にnullを設定することで削除することが出来る
      //
      root = BuildSampleXml();
      elem = root.Elements("Child").First();
      
      elem.SetElementValue("Value", null);
      
      Console.WriteLine(root);
      Console.WriteLine("=====================================");
    }
    
    XElement BuildSampleXml()
    {
      return XElement.Parse("<Root><Child Id=\"100\"><Value>hoge</Value></Child></Root>");
    }
  }
  #endregion

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

  
    
  
  =====================================
  
    
  
  =====================================
  
    
  
  =====================================
  
    
  
  =====================================


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

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

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