いろいろ備忘録日記

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

Linq入門記-70 (LINQ to XML, 属性の更新, XAttribute.Value, XAttribute.SetValue, SetAttributeValue)

LINQ to XMLでの属性の更新について.

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


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

XAttribute.Value
XAttribute.SetValue
SetAttributeValue


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

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


以下、サンプルです。

  #region LinqSamples-66
  /// <summary>
  /// LINQ to XMLのサンプルです.
  /// </summary>
  /// <remarks>
  /// 属性更新系メソッドのサンプルです.
  /// </remarks>
  public class LinqSamples66 : IExecutable
  {
    public void Execute()
    {
      //
      // XAttribute.Value
      //   XElement.Attribute(XName)を利用すると
      //   XAttributeオブジェクトが取得できる.
      //   XAttribute.Valueプロパティに値を設定することで
      //   属性の値が更新できる.
      //
      //   尚、Valueプロパティはstring型のみを受け付ける仕様と
      //   なっているので注意。
      //
      var root = BuildSampleXml();
      var elem = root.Elements("Child").First();
      
      var attr = elem.Attribute("Id");
      attr.Value = 500.ToString();
      
      Console.WriteLine(root);
      Console.WriteLine("=====================================");
      
      //
      // XAttribute.SetValue
      //   XAttribute.Valueと違い、こちらはobject型を受け付けるメソッド。
      //   内部で変換が行われた後、値が設定される.
      //
      root = BuildSampleXml();
      elem = root.Elements("Child").First();
      
      attr = elem.Attribute("Id");
      attr.SetValue(500);
      
      Console.WriteLine(root);
      Console.WriteLine("=====================================");
      
      //
      // SetAttributeValue
      //   すでに存在する要素を指定して、本メソッドを実行すると
      //   属性の値が更新される.
      //
      root = BuildSampleXml();
      elem = root.Elements("Child").First();
      
      elem.SetAttributeValue("Id", 500);
      
      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
    
  
  =====================================
  
    
      hoge
    
  
  =====================================
  
    
      hoge
    
  
  =====================================


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

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

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