LINQ to XML を使用して、入力されるXMLファイルに対応したクラスから、設定されたデータを対応するメンバー変数に設定します。

入力XMLファイルの定義

入力XMLファイルから読み取るXMLの中身を定義します。

<?xml version="1.0" encoding="utf-8"?>
<Books>
    <Book ISBN="978-4048677608">
        <Title>ソードアート・オンライン 1</Title>
        <Author>川原礫</Author>
        <price>
          <newbook>3200</newbook>
          <oldbook>1000</oldbook>
        </price>
    </Book>
    <Book ISBN="978-4757508651">
        <Title>機工魔術士-enchanter- 1</Title>
        <Author>河内和泉</Author>
        <price>
          <newbook>2000</newbook>
          <oldbook>1200</oldbook>
      </price>
    </Book>
</Books>

データを保存するクラス

XMLに対応するBookクラスは、次のようになっていると仮定します。

    public class Book
    {
        public string Title { get; set; }
        public string ISBN { get; set; }
        public string Author { get; set; }
        public string newprice { get; set; }
        public string oldprice { get; set; }
     }

C#のLINQクエリを入力XMLファイルに発行するソフト

入力XMLファイルに対して、次のようにC#のLINQクエリを発行します。Bookクラスのメンバー変数に、入力XMLファイルの対応するデータを取得して設定する。

   class Program
    {
        static void Main(string[] args)
        {
            string path = "base.xml";
            var result = from book in XElement.Load(path).Elements()
                select new Book()
                {
                    ISBN = book.Attribute("ISBN").Value,
                    Title = book.Element("Title").Value,
                    Author = book.Element("Author").Value,
                    newprice = book.Element("price").Element("newbook").Value,
                    oldprice = book.Element("price").Element("oldbook").Value,
                };
            foreach (Book b in result)
            {
               Console.WriteLine(" Title  : " + b.Title);
                Console.WriteLine(" ISBN   : " + b.ISBN);
                Console.WriteLine(" Author : " + b.Author);
                Console.WriteLine(" newprice : " + b.newprice);
                Console.WriteLine(" oldprice : " + b.oldprice);
            }
        }
    }

実行結果は次のようになり、Bookクラスのメンバー変数に、XMLファイルで定義されたデータが設定されていることが確認できました。。

 Title  : ソードアート・オンライン 1
 ISBN   : 978-4048677608
 Author : 川原礫
 newprice : 3200
 oldprice : 1000
 Title  : 機工魔術士-enchanter- 1
 ISBN   : 978-4757508651
 Author : 河内和泉
 newprice : 2000
 oldprice : 1200

Bookエレメント以下のエレメントを取得したい場合は、Element(“取得したい要素名”)で指定した要素名のXElementオブジェクトが取得できます。要素の値を取得する場合は、XElementオブジェクト.Valueで取得できます。同様に属性を取得する場合は、Attribute(“取得したい属性名”)で指定した属性名のXAttributeオブジェクトが取得できます。

XElement,XDocumentのLoadメソッドを使用すると、ファイルやネットワークからXMLファイルをロードし、XElement,XDocumentを初期化できます。読み込むファイルが小さなファイルの場合は、XElement.Loadメソッドを使用します。XElement.Loadメソッドは、メモリ上にXMLファイルの内容が読み込まれてから、クエリの評価が行われますが、XMLファイルのサイズが大きかったり、リモートサイトにある場合は、XmlReaderを使用して、ブロックごとに読み込むようにします。

XElement.Descendants(ノード名)で、ルートノード以下にある”Item”ノードを検索します。検索にマッチしたノードの”code”属性値を選択値として、 partsCode IEnumratableに代入します。

IEnumerable<string> partsCode = from item in dataElem.Descendants("Item")
  select (string)item.Attribute("code");
 foreach (string code in partsCode) {
    textBox2.Text += code +"\r\n";
  }
  textBox2.Text += "---------- \r\n";