XML データを読み込む基本的な方法

ここでは XML ファイルから XPath でノードを抽出する基本的な方法について説明します。

まず元データとなる employees.xml という名前の XML ファイルを作成します。中身は次の通りにします。

employees というルートの中に employee というノードが並んでいます。 このときに employee ノードを取得してその中の情報を出力するのは次のようなコードになります。

using System;
using System.Xml;

namespace xml1 {
    class Program {
        static void Main(string[] args) {
            var xmlDoc = new XmlDocument();
            xmlDoc.Load(@"employees.xml");
            var employees = xmlDoc.SelectNodes("employees/employee");

            foreach (XmlNode emp in employees) {
                var fname = emp.SelectSingleNode("name/first").InnerText;
                var lname = emp.SelectSingleNode("name/last").InnerText;
                var age = emp.Attributes["age"].InnerText;
                Console.WriteLine($"{fname} {lname} ({age})");
            }
        }
    }
}

これを実行するとコンソールに次の内容が出力されるはずです。

Hanako Yamada (25)
Ichiro Suzuki (45)
Kevin Smith (30)

それでは、コードを少しずつみていきます。

var xmlDoc = new XmlDocument();
xmlDoc.Load(@"employees.xml");

XmlDocument オブジェクトを作成して、 Load メソッドに XML ファイルのパスを渡すことによって XML をロードしています。

XML のロードはファイルシステムのパス以外にも URL も指定できます。例えば次のようにできます。

xmlDoc.Load(@"http://csharp.keicode.com/topics/employees.xml");

ちなみに、ファイルなどから XML を読み込むのではなく、XML を記述した文字列を XmlDocument オブジェクトにロードするには LoadXml メソッドを使います。

XmlDocument に XML をロードしたら、SelectNodes メソッドに XPath を渡すことで XML のノードを選択取得できます

var employees = xmlDoc.SelectNodes("employees/employee");

ここではルート要素から XPath を指定していますが、以下のようにも指定できます。

次の表記ではドキュメント全体から employee 要素を選択します。

var employees = xmlDoc.SelectNodes("//employee");

次の表記では 2 番目の employee 要素を取得します。

var employees = xmlDoc.SelectNodes("//employee[2]"); 

今回の XML では "Ichiro Suzuki" の要素のみが選択されます。

次の表記では属性で選択します。gender 属性が "M" に等しい要素を選択します。

var employees = xmlDoc.SelectNodes("//employee[@gender='M']");

次の表記では数値の age 属性が 35 より大きい要素を選択します。

var employees = xmlDoc.SelectNodes("//employee[@age>35]");

残りの部分では抽出された要素の内容を少し表示しています。

上では複数の要素を選択したので SelectNodes メソッドでしたが、 ここでは一つのノードを選択するので SelectSingleNode メソッドであることに注意してください。

foreach (XmlNode emp in employees) {
    var fname = emp.SelectSingleNode("name/first").InnerText;
    var lname = emp.SelectSingleNode("name/last").InnerText;
    var age = emp.Attributes["age"].InnerText;
    Console.WriteLine($"{fname} {lname} ({age})");
}

尚、WriteLine メソッドでは $ 記号をつけて 文字列補間 を利用しています。

以上、ここでは XML ドキュメントでの基本的なデータの読み取り方について説明しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 C# 入門