いろいろ備忘録日記

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

Linq入門記-69 (LINQ to XML, 属性の追加, Add, SetAttributeValue)

LINQ to XMLでの属性の追加について.

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


XElementには、属性の追加を行うためのメソッドがいくつか存在します。

Add(object)
SetAttributeValue(XName, object)


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

XContainer.Add(object)
XElement.SetAttributeValue(XName, object)


SetAttributeValueメソッドは、SetElementValueメソッドと
同じ動きをします。

  • 属性が存在しない場合、新規追加される
  • 属性が存在する場合、更新される
  • 値としてnullを指定すると、削除される


以下、サンプルです。

  #region LinqSamples-65
  /// <summary>
  /// LINQ to XMLのサンプルです.
  /// </summary>
  /// <remarks>
  /// 属性追加系メソッドのサンプルです.
  /// </remarks>
  public class LinqSamples65 : IExecutable
  {
    public void Execute()
    {
      //
      // Add(object)
      //   Addメソッドは、要素の設定にも属性の設定にも利用できる.
      //   注意点として、このメソッドは重複した属性を指定した場合に
      //   InvalidOperationExceptionを発生させる。
      //
      var root = BuildSampleXml();
      var elem = root.Elements("Child").First();
      
      elem.Add(new XAttribute("Id3", 400));
      Console.WriteLine(root);
      
      try
      {
        //
        // すでに存在する属性をAddしようとすると
        // InvalidOperationExceptionが発生する.
        //
        elem.Add(new XAttribute("Id2", 500));
        Console.WriteLine(root);
      }
      catch (InvalidOperationException invalidOpEx)
      {
        Console.WriteLine("[ERROR] {0}", invalidOpEx.Message);
      }
      
      Console.WriteLine("=====================================");
      
      //
      // SetAttributeValue(XName, object)
      //   動作的には、要素の値設定に利用する
      //   SetElementValueメソッドと同じとなる。
      //     - 存在しない属性名称を指定すると追加される
      //     - 存在する属性名称を指定すると更新される
      //     - 値にnullを指定すると属性が削除される
      //
      root = BuildSampleXml();
      elem = root.Elements("Child").First();
      
      elem.SetAttributeValue("Id3", 400);
      Console.WriteLine(elem);
      
      elem.SetAttributeValue("Id3", 500);
      Console.WriteLine(elem);
      
      elem.SetAttributeValue("Id3", null);
      Console.WriteLine(elem);
      
      Console.WriteLine(root);
      Console.WriteLine("=====================================");
    }
    
    XElement BuildSampleXml()
    {
      return XElement.Parse("<Root><Child Id=\"100\" Id2=\"200\"><Value Id=\"300\">hoge</Value></Child></Root>");
    }
  }
  #endregion

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

  
    
      hoge
    
  
  [ERROR] 属性が重複しています。
  =====================================
  
    hoge
  
  
    hoge
  
  
    hoge
  
  
    
      hoge
    
  
  =====================================


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

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

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