いろいろ備忘録日記

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

Linq入門記-59 (LINQ to XML, XMLの出力, XMLファイルの作成, Save)


今回は、LINQ to XMLにてXMLの作成について。

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


要素を構築して、ファイルに出力するにはXDocumentかXElementの
Saveメソッドを利用します。Saveメソッドは以下のオーバーロードを持っています。

Save(Stream)
Save(String)
Save(TextWriter)
Save(XmlWriter)
Save(Stream, SaveOptions)
Save(String, SaveOptions)
Save(TextWriter, SaveOptions)

出力先として、Stream, string(ファイルパス), TextWriter, XmlWriterが
指定できます。SaveOptionsは、書式設定などを出力時に行ってほしくない時などに指定します。


以下、サンプルです。

  #region LinqSamples-56
  /// <summary>
  /// LINQ to XMLのサンプルです。
  /// </summary>
  /// <remarks>
  /// LINQ to XMLにてXMLファイルを新規作成するサンプルです.
  /// </remarks>
  public class LinqSamples56 : IExecutable
  {
    public void Execute()
    {
      //
      // LINQ to XMLにてXMLを新規作成するには
      // 以下のどちらかのインスタンスを作成する必要がある.
      //   ・XDocument
      //   ・XElement
      // 通常、よく利用されるのはXElementの方となる.
      // 保存を行うには、Saveメソッドを利用する.
      // Saveメソッドには、以下のオーバーロードが存在する. (XElement)
      //   Save(Stream)
      //   Save(String)
      //   Save(TextWriter)
      //   Save(XmlWriter)
      //   Save(Stream, SaveOptions)
      //   Save(String, SaveOptions)
      //   Save(TextWriter, SaveOptions)
      //
      var element = new XElement("RootNode",
                          from   i in Enumerable.Range(1, 10)
                          select new XElement("Child", i)
                    );
      
      //
      // Save(Stream)
      //
      using (var stream = new MemoryStream())
      {
        element.Save(stream);
        
        stream.Position = 0;
        using (var reader = new StreamReader(stream))
        {
          Console.WriteLine(reader.ReadToEnd());
        }
      }
      
      Console.WriteLine("===================================");
      
      //
      // Save(String)
      //
      var tmpFile = Path.GetRandomFileName();
      element.Save(tmpFile);
      Console.WriteLine(File.ReadAllText(tmpFile));
      File.Delete(tmpFile);
      
      Console.WriteLine("===================================");
      
      //
      // Save(TextWriter)
      //
      using (var writer = new UTF8StringWriter())
      {
        element.Save(writer);
        Console.WriteLine(writer);
      }
      
      Console.WriteLine("===================================");
      
      //
      // Save(XmlWriter)
      //
      using (var backingStore = new UTF8StringWriter())
      {
        using (var xmlWriter = XmlWriter.Create(backingStore, new XmlWriterSettings { Indent = true }))
        {
          element.Save(xmlWriter);
        }
        
        Console.WriteLine(backingStore);
      }
      
      Console.WriteLine("===================================");
      
      //
      // SaveOptions付きで書き込み.
      //   DisableFormattingを指定すると、出力されるXMLに書式が設定されなくなる.
      //
      using (var writer = new UTF8StringWriter())
      {
        element.Save(writer, SaveOptions.DisableFormatting);
        Console.WriteLine(writer);
      }
    }
    
    class UTF8StringWriter : StringWriter
    {
      public override Encoding Encoding { get { return Encoding.UTF8; } }
    }
  }
  #endregion


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

  <?xml version="1.0" encoding="utf-8"?>
  <RootNode>
    <Child>1</Child>
    <Child>2</Child>
    <Child>3</Child>
    <Child>4</Child>
    <Child>5</Child>
    <Child>6</Child>
    <Child>7</Child>
    <Child>8</Child>
    <Child>9</Child>
    <Child>10</Child>
  </RootNode>
  ===================================
  <?xml version="1.0" encoding="utf-8"?>
  <RootNode>
    <Child>1</Child>
    <Child>2</Child>
    <Child>3</Child>
    <Child>4</Child>
    <Child>5</Child>
    <Child>6</Child>
    <Child>7</Child>
    <Child>8</Child>
    <Child>9</Child>
    <Child>10</Child>
  </RootNode>
  ===================================
  <?xml version="1.0" encoding="utf-8"?>
  <RootNode>
    <Child>1</Child>
    <Child>2</Child>
    <Child>3</Child>
    <Child>4</Child>
    <Child>5</Child>
    <Child>6</Child>
    <Child>7</Child>
    <Child>8</Child>
    <Child>9</Child>
    <Child>10</Child>
  </RootNode>
  ===================================
  <?xml version="1.0" encoding="utf-8"?>
  <RootNode>
    <Child>1</Child>
    <Child>2</Child>
    <Child>3</Child>
    <Child>4</Child>
    <Child>5</Child>
    <Child>6</Child>
    <Child>7</Child>
    <Child>8</Child>
    <Child>9</Child>
    <Child>10</Child>
  </RootNode>
  ===================================
  <?xml version="1.0" encoding="utf-8"?><RootNode><Child>1</Child><Child>2</Child><Child>3</Child><Child>4</Child><Child>5</Child><Child>6</Child><Child>7</Child><Child>8</Child><Child>9</Child><Child>10</Child></RootNode>

SaveOptions.DisableFormattingを指定した場合は、書式設定されずに出力されています。



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

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

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