いろいろ備忘録日記

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

DOMを用いたXML処理(読み込み)(XmlDocument)

前回、XMLの読み出しを記述しましたが
XmlReader, XmlWriterは、それぞれ読み込み専用、書き込み専用の
クラスとなっています。つまり、
XmlReaderクラスでは、XMLデータの編集処理が行えないことになります。


てことで、XMLの読み込み・編集・書き出しをやるには、
XmlReaderとXmlWriterを用いて処理を書くか、それと
DOMやSAXなどの処理を使って書くかというのが基本的な形
となります。(javaでいう、XMLデータマッピングなどはちょっとおいて置いて)


今回は、DOMでXMLデータの読み出しまでをやってみます。
使うクラスは、

System.Xml.XmlDocument

となります。このクラスのLoadメソッドには
URI, ファイルパス、Stream, XmlReaderが渡せます。
一旦、読み込んでしまえば後は、通常のDOM処理ができます。
さらに、XPathも使用できます。


以下、サンプルです。

// 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 XmlDocumentSample{

        public void Execute(){
            using(Stream stream = GetSampleXmlAsStream()){
                //
                // XmlDocumentオブジェクトを作成し、ストリームを
                // ソースとしてDOMを構築.
                //
                XmlDocument doc = new XmlDocument();
                doc.Load(stream);

                //////////////////////////////////////////////////////////
                // 以下のそれぞれの操作は、全て同じ結果を出力します。
                //
                // * person要素の子要素のname要素の値が"gsf_zero8"のものを取得.
                //
                
                //
                // XPath式を用いて、要素集合を取得.
                //
                foreach(XmlNode node in doc.SelectNodes("//name[text()='gsf_zero8']")){
                    Console.WriteLine(node.InnerText);
                }

                //
                //
                // GetElementByTagNameメソッドを利用して要素集合を取得.
                //
                foreach(XmlNode node in doc.GetElementsByTagName("name")){
                    string innerText = node.InnerText;

                    if(innerText.Trim().EndsWith("8")){
                        Console.WriteLine(innerText);
                    }
                }

                //
                // ルートエレメントから要素を下っていく.
                //
                // XmlDocument::DocumentElementプロパティからは、XMLドキュメントの
                // ルートエレメントが取得できる。
                //
                foreach(XmlNode personNode in doc.DocumentElement.ChildNodes){
                    //
                    // root要素の子要素なのでperson要素のループとなる.
                    //
                    foreach(XmlNode personChildNode in personNode.ChildNodes){
                        //
                        // person要素の子要素なのでname,address要素のループとなる.
                        //
                        if(personChildNode.NodeType == XmlNodeType.Element){
                            if(personChildNode.Name.ToLower() == "name"){

                                string innerText = personChildNode.InnerText;

                                if(innerText.Trim().EndsWith("8")){
                                    Console.WriteLine(innerText);
                                }
                            }
                        }
                    }
                }
            }
        }

        Stream GetSampleXmlAsStream(){
            Stream stream = new MemoryStream();

            using(XmlWriter writer = XmlWriter.Create(stream)){
                writer.WriteStartElement("persons");

                for(int i = 0; i < 10; i++){
                    writer.WriteStartElement("person");
                        writer.WriteStartElement("name");
                            writer.WriteStartAttribute("nickname");
                                writer.WriteString("my_nick_name" + (i + 1));
                            writer.WriteEndAttribute();
                            writer.WriteString("gsf_zero" + (i + 1));
                        writer.WriteEndElement();
                        writer.WriteStartElement("address");
                            writer.WriteString("xxxxxxxxxxxxxxxxxxx-" + (i + 1));
                        writer.WriteEndElement();
                    writer.WriteEndElement();
                }

                writer.WriteEndElement();

                writer.Flush();
            }

            stream.Position = 0;

            return stream;
        }

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


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