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