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";