XMLファイルを作成して出力する (SAX方式 XmlWriterを利用) - C#

SAX方式でXMLファイルを作成して出力する方法を紹介します。SAX方式でXMLファイルを作成する場合はXmlWriterクラスを用います。

コード例

/*
using System.Xml;
を追加
*/

private void button1_Click(object sender, EventArgs e)
{
  if (saveFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
    textBox1.Text = saveFileDialog1.FileName;
  }
}

private void button2_Click(object sender, EventArgs e)
{
  XmlWriterSettings settings = new XmlWriterSettings();
  settings.Indent = true;
  settings.IndentChars = "  ";
  settings.Encoding = Encoding.UTF8;

  XmlWriter xmlWriter = XmlWriter.Create(textBox1.Text,settings);

  xmlWriter.WriteStartElement("root");
  xmlWriter.WriteStartElement("item");

  xmlWriter.WriteStartAttribute("code");
  xmlWriter.WriteValue("CA-C-0012");
  xmlWriter.WriteEndAttribute();
      
  xmlWriter.WriteStartElement("name");
  xmlWriter.WriteValue("Penguin Cookie");
  xmlWriter.WriteEndElement();

  xmlWriter.WriteStartElement("price");
  xmlWriter.WriteValue("450");
  xmlWriter.WriteEndElement();

  xmlWriter.WriteEndElement(); //end item
  //
  xmlWriter.WriteStartElement("item");

  xmlWriter.WriteStartAttribute("code");
  xmlWriter.WriteValue("CA-C-0023");
  xmlWriter.WriteEndAttribute();

  xmlWriter.WriteStartElement("name");
  xmlWriter.WriteValue("Dorphin Cookie");
  xmlWriter.WriteEndElement();

  xmlWriter.WriteStartElement("price");
  xmlWriter.WriteValue("250");
  xmlWriter.WriteEndElement();

  xmlWriter.WriteEndElement(); // end item
  //
  xmlWriter.WriteEndElement(); // end root

  xmlWriter.Flush();

  textBox2.Text += "Write Complete!";
}

解説

button1

button1のコードはsaveFileDialogを表示し、ダイアログボックスで設定したファイル名をtextBox1に表示するコードです。

button2

XmlWriterに与える設定情報クラスXmlWriterSettingsクラスの変数を定義しインスタンスを作成します。
  XmlWriterSettings settings = new XmlWriterSettings();

今回の設定では、インデントあり、インデントはスペース2個、XMLファイルの円コーディングはUTF-8としました。
  settings.Indent = true;
  settings.IndentChars = "  ";
  settings.Encoding = Encoding.UTF8;

XmlWriterクラスの変数を定義しインスタンスを作成します。インスタンスは.XmlWriter.Createメソッドを用いて作成します。Createメソッドの引数として出力するXMLファイルのパス、設定情報のXmlWriterSettingsを与えます。
  XmlWriter xmlWriter = XmlWriter.Create(textBox1.Text,settings);

ルートノードとなるエレメントを作成します。名前はrootとします。
  xmlWriter.WriteStartElement("root");

rootエレメントの子としてitemエレメントを作成します。
  xmlWriter.WriteStartElement("item");

itemノードにcode属性を追加します。コードの値としてCA-C-0012を設定します。属性値の設定が終わったら、WriteEndAttribute()メソッドを呼び出してcode属性の編集を終了します。(code属性を閉じます。)
  xmlWriter.WriteStartAttribute("code");
  xmlWriter.WriteValue("CA-C-0012");
  xmlWriter.WriteEndAttribute();

itemノードの子ノードとしてnameエレメントを作成します。nameエレメントには値を持たせるため、WriteValue()メソッドを呼び出して値を設定します。今回は"Penguin Cookie"を設定しました。値の設定が終わった後、WriteEndElement()を呼び出してnameエレメントを閉じます。
 xmlWriter.WriteStartElement("name");
 xmlWriter.WriteValue("Penguin Cookie");
 xmlWriter.WriteEndElement();

同様にitemノードの子ノードにpriceエレメントを作成し、値を設定します。
  xmlWriter.WriteStartElement("price");
  xmlWriter.WriteValue("450");
  xmlWriter.WriteEndElement();

WriteEndElement()メソッドを呼び出し、itemノードを閉じます。
  xmlWriter.WriteEndElement(); //end item

同様の処理を繰り返し、同じ形式のitemノードをもう一つ作成します。
  xmlWriter.WriteStartElement("item");
 
  xmlWriter.WriteStartAttribute("code");
  xmlWriter.WriteValue("CA-C-0023");
  xmlWriter.WriteEndAttribute();
 
  xmlWriter.WriteStartElement("name");
  xmlWriter.WriteValue("Dorphin Cookie");
  xmlWriter.WriteEndElement();
 
  xmlWriter.WriteStartElement("price");
  xmlWriter.WriteValue("250");
  xmlWriter.WriteEndElement();
 
  xmlWriter.WriteEndElement(); // end item

WriteEndElement()メソッドを呼び出しrootノードを閉じます。
  xmlWriter.WriteEndElement(); // end root

書き込みバッファをフラッシュします。
 xmlWriter.Flush();

実行結果

<?xml version="1.0" encoding="utf-8"?>
<root>
  <item code="CA-C-0012">
    <name>Penguin Cookie</name>
    <price>450</price>
  </item>
  <item code="CA-C-0023">
    <name>Dorphin Cookie</name>
    <price>250</price>
  </item>
</root>
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2011-01-12
iPentec all rights reserverd.