前回、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(); } } }
================================
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ