FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

LINQ To XMLを使ってXMLファイルを読み込む

 今回はLINQ To XMLを使ってXMLファイルを読み込む方法を説明します。
 使用するXMLファイルは前回作成したXMLファイルを使用します。
 XMLファイルの中身は以下の様になっています。
<?xml version="1.0" encoding="utf-8"?>
<RootElement>
  <Element1 Attribute1="Attribute1の値">Element1の値</Element1>
  <Element2 Attribute2="Attribute2の値">Element2の値</Element2>
  <List1>
    <Value1>値1</Value1>
    <Value2>値2</Value2>
    <Value3>値3</Value3>
  </List1>
  <List2>
    <Value>1</Value>
    <Value>2</Value>
    <Value>3</Value>
    <Value>4</Value>
    <Value>5</Value>
  </List2>
  <Element3 xmlns="http://www.xml-namespace.com">Element3の値</Element3>
</RootElement>
 以下はこのXMLファイルをLINQ To XMLを使用して読み込むサンプルコードです。
using System;
using System.Xml.Linq;

namespace LinqToXml2
{
    class Program
    {
        static void Main(string[] args)
        {
            var xmlPath = @"XMLファイルのパス";

            // XMLファイルを読み込みXMLツリーを作成
            var rootElement = XElement.Load(xmlPath);

            // 特定の要素を取得する
            var element2 = rootElement.Element("Element2");
            Console.WriteLine("特定の要素を取得");
            Console.WriteLine("取得した要素名  :{0}", element2.Name);
            Console.WriteLine("取得した要素の値:{0}\n", element2.Value);

            // 属性を取得する
            var attribute2 = element2.Attribute("Attribute2");
            Console.WriteLine("特定の属性を取得");
            Console.WriteLine("取得した属性名 :{0}", attribute2.Name);
            Console.WriteLine("取得した属性の値:{0}\n", attribute2.Value);

            // 含まれている要素を列挙する
            var elements = rootElement.Elements();
            Console.WriteLine("要素を列挙");
            foreach(var e in elements)
            {
                Console.WriteLine(e.Name);
            }
            Console.WriteLine();

            // 指定した要素名のみ列挙
            elements = rootElement.Elements("List1");
            Console.WriteLine("List1要素を列挙");
            foreach (var e in elements)
            {
                Console.WriteLine(e.Name);
            }
            Console.WriteLine();

            // 子孫要素も含めて列挙
            elements = rootElement.Descendants();
            Console.WriteLine("子孫要素も含めて列挙");
            foreach (var e in elements)
            {
                Console.WriteLine(e.Name);
            }
            Console.WriteLine();

            // 指定した要素名のみ列挙させる
            elements = rootElement.Descendants("Value");
            Console.WriteLine("Value要素の列挙");
            foreach (var e in elements)
            {
                Console.WriteLine("{0}:{1}", e.Name, (int)e);
            }
            Console.WriteLine();

            // XML名前空間がある場合
            XNamespace ns = @"http://www.xml-namespace.com";
            var element3 = rootElement.Element(ns + "Element3");
            Console.WriteLine("XML名前空間がある場合");
            Console.WriteLine("要素名:{0}", element3.Name);
            Console.WriteLine("値  :{0}", element3.Value);

            Console.ReadLine();
        }
    }
}
 XMLファイルを読み込み、XMLツリーを作成するには以下の1行で済みます。
var rootElement = XElement.Load(xmlPath);

 後はXElementから目的の要素や属性を取得してデータを取り出します。
 特定の要素を取得したい場合はElementメソッドに取得したい要素名を指定します。
 以下の場合はrootElement以下にある子要素の中から「Element2」という要素名をもつ要素を取得します。
 要素名はNameプロパティ、値はValueプロパティで取得できます。
 Valueプロパティはstring型なので数値等の場合は型変換が必要になるので注意してください。
// 特定の要素を取得する
var element2 = rootElement.Element("Element2");
Console.WriteLine("特定の要素を取得");
Console.WriteLine("取得した要素名  :{0}", element2.Name);
Console.WriteLine("取得した要素の値:{0}\n", element2.Value);
 同じような感じで属性の取得もできます。
 属性を取得したい場合はAttributeメソッドを使用します。
// 属性を取得する
var attribute2 = element2.Attribute("Attribute2");
Console.WriteLine("特定の属性を取得");
Console.WriteLine("取得した属性名 :{0}", attribute2.Name);
Console.WriteLine("取得した属性の値:{0}\n", attribute2.Value);
要素、属性の取得

 子要素を列挙したい場合はElementsメソッドを使用します。(属性を列挙したい場合はAttributesメソッドになります。)
 引数の無いElementsメソッドを使用した場合は子要素が全て列挙されます。(孫要素は列挙されません)
// 含まれている要素を列挙する
var elements = rootElement.Elements();
Console.WriteLine("要素を列挙");
foreach(var e in elements)
{
    Console.WriteLine(e.Name);
}
要素を列挙1
 特定の子要素のみを列挙したい場合はElementsメソッドに列挙したい要素名を指定します。
// 指定した要素名のみ列挙
elements = rootElement.Elements("List1");
Console.WriteLine("List1要素を列挙");
foreach (var e in elements)
{
    Console.WriteLine(e.Name);
}
要素を列挙2

 子孫要素も含めて列挙したい場合はDescendantsメソッドを使用します。
 引数なしのDescendantsを使用した場合はすべての子孫要素を列挙します。
// 子孫要素も含めて列挙
elements = rootElement.Descendants();

Console.WriteLine("子孫要素も含めて列挙");
foreach (var e in elements)
{
    Console.WriteLine(e.Name);
}
要素を列挙3
 Descendantsメソッドに要素名を指定すると、指定した要素名の要素のみが列挙されます。
elements = rootElement.Descendants("Value");
Console.WriteLine("Value要素の列挙");
foreach (var e in elements)
{
    Console.WriteLine("{0}:{1}", e.Name, (int)e);
}
要素を列挙4
 要素や属性の値はstring型になっています。そのため数値等の場合は型変換が必要になります。
 Valueプロパティの値を型変換しても良いのですが、もっと簡単に型変換できます。
 (int)eの様に要素や属性そのものに対してキャストすると値を指定した型にキャストしてくれます。

 最後に、XML名前空間がある場合です。
 要素を作成したときと同じく[名前空間] + [要素名]で取得します。
XNamespace ns = @"http://www.xml-namespace.com";
var element3 = rootElement.Element(ns + "Element3");

Console.WriteLine("XML名前空間がある場合");
Console.WriteLine("要素名:{0}", element3.Name);
Console.WriteLine("値  :{0}", element3.Value);
XML名前空間がある場合

 LINQ To XMLを使用してXMLファイルを読み取る方法はこんな感じです。
 Elementsメソッド等の要素コレクションを返すメソッドはそのままLINQメソッドにつなげて処理できます。
 XMLファイルからデータを復元する時は、Elementsメソッド等で要素を列挙→Selectメソッドで要素からインスタンスに変換といった流れになると思います。
 名前の通りLINQと合わせて使うことでかなり強力なツールになります。
 XMLファイルを扱う場合はLINQ To XMLを試してみてください。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

カレンダー
11 | 2018/12 | 01
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
全記事表示リンク

全ての記事を表示する

カテゴリ
タグリスト

月別アーカイブ
11  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09 
最新記事
リンク
最新コメント
検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。