いろいろ備忘録日記

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

XMLの読み出し(XmlReader)

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

System.Xml.XmlReader.Create

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


以下サンプルです。

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

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

namespace Gsf.Samples.CSharp{

    class ReadXmlSample{

        public void Execute(){
            //
            // ターゲットとなるXMLを作成・確認.
            //
            Stream stream = GetSampleXmlAsStream();

            Console.WriteLine(new StreamReader(stream).ReadToEnd());

            stream.Position = 0;

            //
            // XmlReaderを使用して読み出し.
            // 
            // XmlReaderSettingsについては、msdnを参照願います。
            // 今回は、XMLが整形式であることとします。
            //
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.IgnoreWhitespace = true;
            settings.IgnoreComments   = true;

            //
            // もっとも低レベルな読み取り.
            //
            // 一つ一つ要素をめぐっていくパターン.
            //
            using(XmlReader reader = XmlReader.Create(stream, settings)){
                //
                // XmlReaderが最初に作成された時は、読み取る要素が存在していません。
                // Readメソッドをコールして、最初のノードをまず読み取る必要があります。
                //
                for(;reader.Read();){
                    //
                    // 読み出し.
                    //
                    // 現在カーソル位置は、xml宣言を指している.
                    //
                    reader.ReadStartElement("root");
                    //
                    // この時点でカーソルはpersonを指している.
                    //
                    reader.ReadStartElement("person");
                    //
                    // この時点でカーソルはnameを指している.
                    //
                    Console.WriteLine(reader.GetAttribute("nickname"));
                    reader.ReadStartElement("name");
                    Console.WriteLine(reader.ReadString());
                    reader.ReadEndElement();
                    //
                    // この時点でカーソルはaddressを指している.
                    //
                    reader.ReadStartElement("address");
                    Console.WriteLine(reader.ReadString());
                    reader.ReadEndElement();
                    //
                    // この時点でカーソルはtelを指している.
                    // テキストだけの要素の場合は、以下のようにしても取得できる.
                    // 
                    Console.WriteLine(reader.ReadElementString("tel"));
                    reader.ReadEndElement();
                    reader.ReadEndElement();
                }
            }

            stream.Position = 0;

            //
            // 直接、データを取得したい要素を指定する.
            //
            using(XmlReader reader = XmlReader.Create(stream, settings)){

                for(;reader.Read();){
                    //
                    // ReadToFollowingメソッドは、指定された要素が見つかるまで読み込みを
                    // 行います.
                    //
                    reader.ReadToFollowing("name");
                    Console.WriteLine(reader.GetAttribute("nickname"));
                    Console.WriteLine(reader.ReadString());

                    reader.ReadToFollowing("address");
                    Console.WriteLine(reader.ReadString());

                    reader.ReadToFollowing("tel");
                    Console.WriteLine(reader.ReadString());
                }
            }

        }

        internal Stream GetSampleXmlAsStream(){

            Stream stream = new MemoryStream();

            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent      = true;
            settings.IndentChars = "    ";

            using(XmlWriter writer = XmlWriter.Create(stream, settings)){
                writer.WriteStartElement("root");
                    writer.WriteStartElement("person");
                        writer.WriteStartElement("name");
                            writer.WriteStartAttribute("nickname");
                                writer.WriteString("my_nick_name");
                            writer.WriteEndAttribute();
                            writer.WriteString("gsf_zero1");
                        writer.WriteEndElement();
                        writer.WriteStartElement("address");
                            writer.WriteString("xxxxxxxxxxxxxxxxxxxxxx");
                        writer.WriteEndElement();
                        writer.WriteStartElement("tel");
                            writer.WriteString("000-0000-0000");
                        writer.WriteEndElement();
                    writer.WriteEndElement();
                writer.WriteEndElement();

                writer.Flush();
            }

            stream.Position = 0;

            return stream;
        }

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


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

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