いろいろ備忘録日記

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

Linq入門記-56 (LINQ to XML, XDocument, XElement, Load, URIを指定して読み込み)


今回は、URIを指定して読み込みを行うLoadメソッドについてメモ。

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

サンプルコードは、まとめてCodePlexにアップしてます。


文字列以外の方法で、読み込みを行う場合
Loadメソッドを利用します。LoadメソッドはXDocument, XElementの
両方で定義されています。書式は以下の通り。

public static XElement Load(
	Stream stream
)

public static XElement Load(
	string uri
)

public static XElement Load(
	TextReader textReader
)

public static XElement Load(
	XmlReader reader
)

public static XElement Load(
	Stream stream,
	LoadOptions options
)

public static XElement Load(
	string uri,
	LoadOptions options
)

public static XElement Load(
	TextReader textReader,
	LoadOptions options
)

public static XElement Load(
	XmlReader reader,
	LoadOptions options
)


大別すると

  • URIを指定して読み込み
  • ストリームを指定して読み込み

となります。今回はURIを指定しての読み込みについて。


以下、サンプルです。

  #region LinqSamples-53
  /// <summary>
  /// LINQ to XMLのサンプルです。
  /// </summary>
  /// <remarks>
  /// XElement.Loadを利用した読み込みのサンプルです。
  /// </remarks>
  public class LinqSamples53 : IExecutable
  {
    const string FILE_URI     = @"LinqSamples53_Sample.xml";
    const string DOWNLOAD_URI = @"https://sites.google.com/site/gsfzero1/Home/Books.xml?attredirects=0&d=1";
    
    public void Execute()
    {
      //
      // XElementもXDocumentもParseメソッドの他に
      // 自身を構築するためのLoadメソッドを持っている.
      //
      // Parseメソッドは、文字列を解析して構築する時に利用し
      // Loadメソッドは、既に存在しているものを読み込む際に利用する.
      //
      // Loadメソッドは、複数のオーバーロードを持ち
      //   ・URIを指定
      //   ・ストリームを指定
      // に大別される.
      //
      // 本サンプルでは、URIによる読み込みを記述する.
      // URIを指定するLoadメソッドのオーバーロードは以下の通り。
      //
      //   public XDocument Load(string)
      //   public XDocument Load(string, LoadOptions)
      //   public XElement  Load(string)
      //   public XElement  Load(string, LoadOptions)
      //
      CreateSampleXml();
      
      var rootElement = XElement.Load(FILE_URI);
      var query       = from   element in rootElement.Descendants("Person")
                        let    name = element.Attribute("name").Value
                        where  !name.StartsWith("b")
                        select new { name };
      
      foreach (var item in query)
      {
        Console.WriteLine(item);
      }
      
      //
      // URLからXMLを読み込み
      //   XMLファイルは以下のサンプルを利用させてもらっている。
      //     http://msdn.microsoft.com/ja-jp/library/vstudio/bb387066.aspx
      //
      Console.WriteLine(XElement.Load(DOWNLOAD_URI));
    }
    
    void CreateSampleXml()
    {
      if (File.Exists(FILE_URI))
      {
        File.Delete(FILE_URI);
      }
      
      var doc = MakeDocument();
      doc.Save(FILE_URI);
    }
    
    XDocument MakeDocument()
    {
      var doc   = new XDocument
                  (
                    new XDeclaration("1.0", "utf-8", "yes"),
                    new XElement("Persons", MakePersonElements())
                  );
    
      return doc;
    }
    
    IEnumerable<XElement> MakePersonElements()
    {
      var names = new []{ "foo", "bar", "baz" };
      var query = from   name in names
                  select new XElement
                         (
                           "Person",
                           new XAttribute("name", name),
                           string.Format("VALUE-{0}", name)
                         );
      
      return query;
    }
  }
  #endregion


実行結果は以下のようになります。

  { name = foo }
  
    
      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.
    
  


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

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

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