いろいろ備忘録日記

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

Linq to XMLのサンプル (linq, xml, XElement, MemoryStream)

LINQ系の内容は以下から見れます。よろしければご参照くださいませ。


以下、メモ書きです。


Linq to XMLがどんなものか知りたかったので、ちょっとサンプルつくってみました。
便利ですね〜やっぱり。XMLの操作が大分楽になります。


コアとして利用するクラスは以下のものです。

System.Xml.Linq.XElement

以下のサンプルでは、ファイルからの処理とストリームからの処理を記述しています。
まずは、テストデータが入っているXMLファイル。

<?xml version="1.0" encoding="utf-8" ?>
<persons>
    <person>
        <name>gsf_zero1</name>
        <age>28</age>
    </person>
    <person>
        <name>gsf_zero2</name>
        <age>29</age>        
    </person>
    <person>
        <name>gsf_zero3</name>
        <age>30</age>
    </person>
    <person>
        <name>gsf_zero4</name>
        <age>31</age>
    </person>
    <person>
        <name>gsf_zero5</name>
        <age>32</age>
    </person>
    <person>
        <name>gsf_zero6</name>
        <age>33</age>
    </person>
</persons>


んで、サンプルプログラムです。

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:
using System;
using System.IO;
using System.Linq;
using System.Xml.Linq;

namespace Gsf.Samples.CSharp {

    /// <summary>
    /// Linq to Xmlのサンプルプログラム-01
    /// </summary>
    /// <remarks>
    /// XElementの使用のサンプルです。
    /// </remarks>
    public class EntryPoint {

        static void Main() {
            //
            // XMLデータをロードし、ageが30以上のデータのみを抽出。
            // 抽出したデータのnameの値を表示する。
            //
            //
            // XMLデータをファイルから読み込み抽出.
            //
            var result = from person in XElement.Load("TestData.xml").Elements()
                         where ( (int) person.Element("age")) >= 30
                         select person.Element("name").Value;

            foreach (var name in result) {
                Console.WriteLine(name);
            }

            //
            // XMLデータをストリームから読み込み抽出.
            //
            var result2 = from person in XElement.Load(CreateSampleXml()).Elements()            
                          where ( (int) person.Element("age")) >= 30
                          select person.Element("name").Value;

            foreach (var name in result2) {
                Console.WriteLine(name);
            }

            Console.ReadLine();
        }

        static TextReader CreateSampleXml(){
            //
            // 以下のXML構造を作成する。
            //
            // ルート要素:persons
            // 直下の要素:person
            //      person内の要素1:name (string)
            //      person内の要素2:age  (int)
            //
            XElement root = new XElement("persons");

            for(int i = 0; i < 6; i++){
                XElement person = new XElement("person");

                person.Add(new XElement("name", string.Format("gsf_zero{0}", (i + 1).ToString())));
                person.Add(new XElement("age",  (28 + i)));

                root.Add(person);
            }
            
            /////////////////////////////////////////////////////
            //
            // 戻り値となるストリームを構築する。
            //
            MemoryStream stream = new MemoryStream();

            //
            // 文字列データを一気に書き込む為にTextWriterを利用する。
            //
            StreamWriter writer = new StreamWriter(stream);
            writer.Write(root.ToString());
            writer.Flush();

            //
            // データが書き込まれたので、シーク位置を先頭に戻す。
            //
            stream.Position = 0;

            return new StreamReader(stream);
        }

    }

}


実行すると、どちらの場合も

gsf_zero3
gsf_zero4
gsf_zero5
gsf_zero6

と表示されます。



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

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