.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(); } } }
================================
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場