いろいろ備忘録日記

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

Linq入門記-90 (LINQ to XML, アノテーション, AddAnnotation, Annotation, RemoveAnnotations)


LINQ to XMLでのアノテーションについて.

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


今回は、アノテーションについて.
アノテーションとは、そのままの意味通り「注釈」という意味です。
LINQ to XMLでは、それぞれのデータに対してアノテーションを付与することができます。


アノテーションに関するメソッドは、XObjectクラスに所属しています。


付与したアノテーションは、LINQ to XMLで処理している間のみ有効なデータです。
永続化されず、ToStringにも表示されません。
WinFormsとかのTagプロパティみたいな感じでちょっとしたデータを入れておく事ができます。


以下、サンプルです。

namespace Gsf.Samples
{
  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Xml.Linq;

  #region LinqSamples-86
  /// <summary>
  /// LINQ to XMLのサンプルです.
  /// </summary>
  /// <remarks>
  /// LINQ to XMLのアノテーション機能についてのサンプルです。
  /// </remarks>
  public class LinqSamples86 : IExecutable
  {
    public void Execute()
    {
      // LINQ to XMLでは、それぞれのデータに対して
      // アノテーションを付与することが出来る。
      //
      //  XObject.AddAnnotation
      //  XObject.Annotation(Type)
      //         .Annotation<T>()
      //         .Annotations(Type)
      //         .Annotations<T>()
      //  XObject.RemoveAnnotations(Type)
      //         .RemoveAnnotations<T>()
      //
      // アノテーションは、LINQ to XMLで処理している間のみ有効なデータ.
      // 永続化されず、ToStringにも表示されない
      // Tagプロパティのような使い方が出来る.
      //
      // コレクションを扱うAnnotationsメソッドのコードは割愛
      //
      var root = BuildSampleXml();
      var elem = root.Descendants("Price").Last();

      //
      // アノテーションを追加.
      //
      elem.AddAnnotation(new Tag("Tag Value"));

      //
      // アノテーションが付いている要素を列挙してみる.
      //
      foreach (var item in QueryHasAnnotation(root))
      {
        Console.WriteLine(item);
        Console.WriteLine(item.Annotation<Tag>().Value);
      }

      //
      // アノテーションを削除
      //
      elem.RemoveAnnotations<Tag>();

      Console.WriteLine(QueryHasAnnotation(root).Count());

      //
      // アノテーションを付与した状態でToStringしてみる
      //
      elem.AddAnnotation(new Tag("Tag Value"));
      Console.WriteLine(root);
    }

    IEnumerable<XElement> QueryHasAnnotation(XElement root)
    {
      var query = from el in root.Descendants()
                  let an = el.Annotation<Tag>()
                  where an != null
                  select el;

      return query;
    }

    XElement BuildSampleXml()
    {
      //
      // サンプルXMLファイル
      //  see: http://msdn.microsoft.com/ja-jp/library/vstudio/ms256479(v=vs.90).aspx
      //
      return XElement.Load(@"xml/Books.xml");
    }

    class Tag
    {
      public Tag(string value)
      {
        Value = value;
      }

      public string Value { get; private set; }
    }
  }
  #endregion
}


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

  5.95
  Tag Value
  0
  
    
      Garghentini, Davide
      <a class="keyword" href="http://d.hatena.ne.jp/keyword/XML">XML</a> Developer's Guide
      Computer
      44.95
      2000-10-01
      An in-depth look at creating applications
        with XML.
    
    
      Garcia, Debra
      Midnight Rain
      Fantasy
      5.95
      2000-12-16
      A former architect battles corporate zombies,
        an evil sorceress, and her own childhood to become queen
        of the world.
    
  


以下、参照リソースです。

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

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