いろいろ備忘録日記

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

XMLの書き出し(XmlWriter)

.NETでのXMLの書き出しには、System.Xml名前空間のクラスを用います。
バージョン 2.0までは、System.Xml.XmlTextWriterを利用して書き出しを行っていましたが
2.0からは、以下のメソッドが推奨となっています。

System.Xml.XmlWriter.Create

上記の静的メソッドに、System.Xml.XmlWriterSettingsオブジェクトを渡し、生成された
XmlWriterで出力を行います。


以下、サンプルです。

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:

using System;
using System.IO;
using System.Text;
using System.Xml;

namespace Gsf.Samples.CSharp{

    class WriteXmlSample{

        public void Execute(){
            //
            // .NET Framework 2.0では、XmlTextWriterではなく
            // XmlWriter.Createメソッドの使用が推奨されています。
            //
            // 設定オブジェクトを作成.
            // このオブジェクトには、予めデフォルト値が設定されています。
            // デフォルト値の詳細は、msdnを参照してください。
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent      = true;
            settings.IndentChars = "    ";

            //
            // 書き出し.
            //
            // バッキングストアには、MemoryStreamを使用。
            // 同じ目的ならStringWriterの方が楽ですが、こちらは内部のEncoding設定が
            // utf-16固定となっており、StringWriterでXMLを出力するとXML宣言のencodingが
            // 強制的にutf-16になってしまいます。
            //
            using(Stream stream = new MemoryStream()){
                using(XmlWriter xmlWriter = XmlWriter.Create(stream, settings)){

                    xmlWriter.WriteStartElement("root");
                        xmlWriter.WriteElementString("child", "ほげ");
                        xmlWriter.WriteStartElement("child");
                            xmlWriter.WriteStartElement("child-child");
                                xmlWriter.WriteStartAttribute("attr");
                                    xmlWriter.WriteString("attr-value");
                                xmlWriter.WriteEndAttribute();
                                xmlWriter.WriteString("へへ");
                            xmlWriter.WriteEndElement();
                        xmlWriter.WriteEndElement();
                    xmlWriter.WriteEndElement();

                    xmlWriter.Flush();

                }

                //
                // ストリームのポジションを戻してから出力.
                //
                stream.Position = 0;
                Console.WriteLine(new StreamReader(stream).ReadToEnd());

            }

        }

        static void Main(){
            new WriteXmlSample().Execute();
        }
    }
}


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

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