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を愛用