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操作には便利なツールなので、目的に応じて使い分けましょう。
まとめ
この記事で学んだことの振り返り
この記事では、C#でXMLファイルを操作する基本から応用までを、初心者にも分かりやすい形で学んできました。XMLファイルとは何かという基礎的な考え方から始まり、タグによる階層構造、親要素と子要素の関係性、データを安全に保存・管理するための役割について理解を深めました。XMLはC#のアプリケーション開発だけでなく、設定ファイルやデータ連携、外部システムとのやり取りなど、さまざまな場面で使われる重要な技術です。
まず、XmlDocumentクラスを使ったXML操作では、XMLをツリー構造として扱い、ノードを一つずつ取得・編集する方法を学びました。GetElementsByTagNameを使った要素の取得や、InnerTextによる文字データの読み取り、CreateElementやAppendChildを使ったXMLの生成など、XMLファイルの基本的な読み書き処理を理解できたはずです。XmlDocumentは少し記述量が多くなりますが、ノード単位で細かく制御したい場合には今でも有効な方法です。
次に、LINQ to XMLを使った方法では、より直感的で読みやすいコードでXMLを操作できることを確認しました。XDocumentやXElementを使うことで、XMLの構造をそのままC#コード上に表現でき、LINQ構文を使って必要なデータだけを簡単に抽出できます。XMLファイルの読み込み、検索、書き込みが非常にスマートになるため、近年のC#開発では主流となっている理由も理解できたのではないでしょうか。
また、XmlDocumentとLINQ to XMLの使い分けについても整理しました。既存の古いシステムや細かいノード制御が必要な場面ではXmlDocument、新規開発や保守性・可読性を重視する場合にはLINQ to XMLを選ぶ、といった判断基準を持つことが大切です。C#でXMLファイルを扱えるようになることで、設定管理やデータ保存の幅が大きく広がります。
サンプルプログラムの考え方の整理
サンプルプログラムでは、XMLファイルを「読む」「作る」「保存する」という一連の流れを体験しました。どのサンプルでも共通して重要なのは、XMLの構造をしっかりイメージすることです。どのタグが親で、どのタグが子なのかを理解できていれば、C#のコードは自然と読みやすくなります。XML操作でエラーが出た場合も、構造の理解不足が原因であることが多いため、まずはXMLファイル自体を丁寧に確認する習慣を身につけましょう。
using System;
using System.Xml.Linq;
class Program
{
static void Main()
{
XElement sample =
new XElement("sample",
new XElement("message", "XML操作の理解が深まりました"),
new XElement("level", "初心者向け")
);
sample.Save("summary.xml");
Console.WriteLine("まとめ用XMLを作成しました。");
}
}
このように、LINQ to XMLを使えば、学習内容を整理したデータをXMLとして保存することも簡単です。学んだ内容をXMLにまとめることで、復習用データとして活用することもできます。
生徒:「先生、C#でXMLを操作する方法がだいぶ分かってきました。最初は難しそうに感じましたが、構造を意識すると理解しやすいですね。」
先生:「その通りです。XMLは見た目が少し堅く感じますが、親子関係を理解すれば怖くありません。C#のクラスと組み合わせることで、実務でも役立つ知識になりますよ。」
生徒:「XmlDocumentとLINQ to XMLの違いも理解できました。これからはLINQ to XMLを中心に使ってみようと思います。」
先生:「良い選択ですね。まずはLINQ to XMLで基本を押さえて、必要に応じてXmlDocumentも使えるようになると理想的です。」
生徒:「C#でXMLファイルを読み書きできるようになったことで、設定ファイルの管理やデータ保存にも自信が持てそうです。」
先生:「それは大きな成長です。XML操作は多くの現場で使われるので、今回学んだ内容をしっかり復習して、実際のプログラムに活かしていきましょう。」