C#でXMLファイルを操作する方法(XmlDocument・LINQ to XML)を初心者向けに解説!
生徒
「先生、C#でXMLファイルを読み書きするにはどうしたらいいですか?」
先生
「いい質問ですね。XMLファイルはデータを階層的に保存する形式で、C#でも簡単に操作できますよ。」
生徒
「階層的っていうのは、フォルダの中にファイルがあるような構造ですか?」
先生
「そうです!XMLは“親子関係”を持つデータ構造なんです。今日はXmlDocumentクラスとLINQ to XMLという2つの方法で、XMLを操作する方法を学びましょう。」
1. XMLファイルとは?
XML(eXtensible Markup Language)とは、データを「タグ」で囲んで表現するファイル形式です。HTMLと似ていますが、表示目的ではなくデータを保存・やりとりするために使われます。
たとえば、次のような内容がXMLファイルです。
<books>
<book>
<title>はじめてのC#</title>
<author>山田太郎</author>
</book>
<book>
<title>LINQ入門</title>
<author>佐藤花子</author>
</book>
</books>
この例では、<books>が親要素で、<book>が子要素になっています。XMLファイルを読み取るときは、この親子関係をたどってデータを取得します。
2. XmlDocumentを使ってXMLを読み取る方法
XmlDocumentクラスは、XMLファイルをツリー構造(木の枝のような階層)として読み書きできるクラスです。C#の標準ライブラリで利用できます。
まずは、XMLを読み込んで中のデータを表示してみましょう。
using System;
using System.Xml;
class Program
{
static void Main()
{
XmlDocument doc = new XmlDocument();
doc.Load("books.xml"); // XMLファイルを読み込む
XmlNodeList books = doc.GetElementsByTagName("book");
foreach (XmlNode book in books)
{
string title = book["title"].InnerText;
string author = book["author"].InnerText;
Console.WriteLine($"タイトル: {title}, 著者: {author}");
}
}
}
タイトル: はじめてのC#
著者: 山田太郎
タイトル: LINQ入門
著者: 佐藤花子
Load()メソッドでXMLを読み込み、GetElementsByTagName()で特定のタグをまとめて取得しています。InnerTextプロパティを使うと、タグの中の文字データを取得できます。
3. XmlDocumentでXMLを書き込む方法
次に、C#から新しくXMLファイルを作成してみましょう。
using System;
using System.Xml;
class Program
{
static void Main()
{
XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement("books");
doc.AppendChild(root);
XmlElement book = doc.CreateElement("book");
XmlElement title = doc.CreateElement("title");
title.InnerText = "C#超入門";
book.AppendChild(title);
XmlElement author = doc.CreateElement("author");
author.InnerText = "田中一郎";
book.AppendChild(author);
root.AppendChild(book);
doc.Save("new_books.xml"); // 保存
Console.WriteLine("XMLファイルを作成しました。");
}
}
XMLファイルを作成しました。
CreateElement()で新しいタグを作り、AppendChild()で親要素に追加しています。最後にSave()でファイルとして出力します。
4. LINQ to XMLを使ったスマートな操作
XmlDocumentでも十分ですが、もっと簡単に扱いたいときはLINQ to XMLが便利です。LINQ(Language Integrated Query)は、データを検索・操作するためのC#の機能です。
まずは、XMLを読み込んでデータを表示する例を見てみましょう。
using System;
using System.Linq;
using System.Xml.Linq;
class Program
{
static void Main()
{
XDocument xdoc = XDocument.Load("books.xml");
var books = from b in xdoc.Descendants("book")
select new
{
Title = b.Element("title")?.Value,
Author = b.Element("author")?.Value
};
foreach (var book in books)
{
Console.WriteLine($"タイトル: {book.Title}, 著者: {book.Author}");
}
}
}
タイトル: はじめてのC#
著者: 山田太郎
タイトル: LINQ入門
著者: 佐藤花子
XDocumentはLINQ専用のXMLクラスです。LINQの構文を使って「bookタグの中にあるtitleとauthorを取り出す」といった操作を簡潔に書けます。
5. LINQ to XMLでXMLを書き出す
LINQ to XMLでは、C#のオブジェクト構文を使って、直感的にXMLを作成できます。
using System;
using System.Xml.Linq;
class Program
{
static void Main()
{
XElement books =
new XElement("books",
new XElement("book",
new XElement("title", "C#応用編"),
new XElement("author", "鈴木太郎")
),
new XElement("book",
new XElement("title", "XML完全ガイド"),
new XElement("author", "佐々木花子")
)
);
books.Save("linq_books.xml");
Console.WriteLine("LINQでXMLファイルを作成しました。");
}
}
LINQでXMLファイルを作成しました。
このように、XElementを使うと入れ子構造をそのまま書けるので、コードが非常に読みやすくなります。
6. XmlDocumentとLINQ to XMLの使い分け
最後に、それぞれの特徴をまとめます。
- XmlDocument:昔からある方法で、細かいノード操作に向いている。
- LINQ to XML:コードが簡潔で、読み書きがスマート。新しい開発ではこちらが主流。
どちらもXML操作には便利なツールなので、目的に応じて使い分けましょう。