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 ドキュメントでの基本的なデータの読み取り方について説明しました。