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

いろいろ備忘録日記

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

Linq入門記-85 (LINQ to XML, 並び順, InDocumentOrder)

LINQ to XMLでの並び順を整えるメソッドについて.

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


今回は、要素のコレクションをドキュメント内の並び順に合わせるInDocumentOrder拡張メソッドについてです。
このメソッドを利用すると、たとえばバラバラになっている要素のコレクションを元のドキュメント内での並び順に
することができます。


このメソッドは拡張メソッドとなっており、本体は以下のクラスに定義されています。

System.Xml.Linq.Extensions


メソッドの書式は以下のようになっています。

public static IEnumerable InDocumentOrder(
this IEnumerable source
)
where T : XNode


以下、サンプルです。

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

  #region LinqSamples-81
  /// <summary>
  /// LINQ to XMLのサンプルです.
  /// </summary>
  /// <remarks>
  /// ドキュメント順に並び替え(InDocumentOrder)のサンプルです.
  /// </remarks>
  public class LinqSamples81 : IExecutable
  {
    public void Execute()
    {
      //
      // InDocumentOrder<T> where T : XNode (拡張メソッド)
      //   元のシーケンスをドキュメント内の順序に従うよう並び替える.
      //
      var root = BuildSampleXml();
      var reversed = root.Elements().Reverse();

      // Reverseしているので逆順で表示される
      foreach (var elem in reversed)
      {
        Console.WriteLine(elem);
      }

      Console.WriteLine("=====================================");

      // InDocumentOrderを行うことにより、要素が正しい順序に並び替えられる
      foreach (var elem in reversed.InDocumentOrder())
      {
        Console.WriteLine(elem);
      }

      Console.WriteLine("=====================================");

      // 特定の要素をピックアップして、シーケンス作成。わざと順序を変えている.
      XElement[] elemList = { root.Descendants("Title").Last(), root.Descendants("Title").First() };

      // そのまま表示すると当然順序は変わったまま
      foreach (var elem in elemList)
      {
        Console.WriteLine(elem);
      }

      Console.WriteLine("=====================================");

      // InDocumentOrderを付けることにより、ドキュメント内の正しい順序に並び替えられる
      foreach (var elem in elemList.InDocumentOrder())
      {
        Console.WriteLine(elem);
      }
    }

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


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

  
    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.
  
  
    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.
  
  =====================================
  
    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.
  
  =====================================
  Midnight Rain
  <a class="keyword" href="http://d.hatena.ne.jp/keyword/XML">XML</a> Developer's Guide
  =====================================
  <a class="keyword" href="http://d.hatena.ne.jp/keyword/XML">XML</a> Developer's Guide
  Midnight Rain


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


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

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