C#でXMLを扱う基本!XmlDocumentの使い方と読み込み・保存を徹底解説
生徒
「C#でデータの保存をしたいのですが、XMLという形式が良いと聞きました。どうやって操作すればいいですか?」
先生
「XMLは、タグを使ってデータを構造化して管理する便利な形式です。C#ではXmlDocumentクラスを使うのが基本ですよ。」
生徒
「初心者でも簡単にデータの読み込みや書き換えができるでしょうか?」
先生
「もちろんです!まずはXMLの構造を知ることから始めて、少しずつコードを書いていきましょう。」
1. XMLとは何かを理解しよう
プログラミングの世界では、データを保存したり他のプログラムに受け渡したりする際に、特定の形式を使います。その代表的なものがXML(エックスエムエル)です。 XMLは「Extensible Markup Language」の略で、日本語では「拡張可能なマークアップ言語」と呼ばれます。
「マークアップ」とは、文章の中に「ここからここまでは名前です」「ここからここまでは値段です」という印をつけることです。 例えば、料理のレシピをデータにする場合、料理名や材料、作り方を特定のタグで囲んで表現します。 パソコンを初めて触る方でもイメージしやすいように例えると、書類を整理する際の「見出し付きのクリアファイル」のようなものです。
XMLの最大の特徴は、人間が見ても内容が理解しやすく、同時にコンピュータにとっても解析しやすいという点にあります。 C#というプログラミング言語では、このXMLを自由に操るための道具が最初から用意されています。
2. XMLの基本構造とタグの役割
XMLを操作する前に、まずはその書き方のルールを知っておく必要があります。XMLは必ず「タグ」と呼ばれる記号でデータを囲みます。
<名前>田中太郎</名前>という書き方が基本です。
最初の<名前>を開始タグ、終わりの</名前>を終了タグと呼びます。
また、XMLには「親子関係」という考え方があります。大きな箱の中に小さな箱が入っている状態をイメージしてください。 一番外側の大きな箱をルート要素と呼び、その中にある要素を子要素と呼びます。 ひとつのXMLファイルには、必ずひとつだけルート要素が存在しなければならないという決まりがあります。
以下に、簡単なXMLの例を示します。
<BookShelf>
<Book>
<Title>C#入門</Title>
<Price>2000</Price>
</Book>
<Book>
<Title>XMLの基本</Title>
<Price>1800</Price>
</Book>
</BookShelf>
3. XmlDocumentクラスとは?
C#でXMLを読み書きする際に、古くから使われている最も基本的な方法がXmlDocument(アイエムエル・ドキュメント)クラスです。 これは、XMLファイルの内容をパソコンのメモリ上に「家系図」のようなツリー構造として展開して保持する仕組みです。
この仕組みを専門用語で「DOM(ドム)」と呼びます。DOMは「Document Object Model」の略で、ドキュメントを物体(オブジェクト)として扱うモデルのことです。 一度メモリに読み込んでしまえば、特定の場所にあるデータを探したり、内容を書き換えたり、新しく項目を追加したりすることが非常に簡単に行えます。
初心者の方が最初につまずきやすいのが、「クラス」という言葉ですが、これは「便利な道具箱」だと思ってください。 XmlDocumentという道具箱の中には、XMLを読み込むためのスイッチや、保存するためのボタンが入っているのです。
4. XMLファイルを新しく作成して保存する方法
まずは、プログラムを使ってゼロからXMLファイルを作ってみましょう。 XmlDocumentをインスタンス化(道具を使える状態にすること)し、要素を作成して、それを組み立てていきます。
以下のコードは、ユーザー情報を保存するためのXMLを作成する例です。
using System;
using System.Xml;
class Program
{
static void Main()
{
// XMLドキュメントのインスタンスを作成
XmlDocument doc = new XmlDocument();
// XMLの宣言(バージョンや文字コードの設定)を追加
XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
doc.AppendChild(dec);
// ルート要素「Users」を作成
XmlElement root = doc.CreateElement("Users");
doc.AppendChild(root);
// 子要素「User」を作成
XmlElement user = doc.CreateElement("User");
user.SetAttribute("id", "001"); // 属性の設定
// さらにその中の要素「Name」を作成
XmlElement name = doc.CreateElement("Name");
name.InnerText = "山田花子"; // 中身の文字を設定
user.AppendChild(name);
// ルートにUserを追加
root.AppendChild(user);
// ファイルとして保存
doc.Save("users.xml");
Console.WriteLine("XMLファイルを作成しました。");
}
}
このプログラムを実行すると、実行ファイルと同じフォルダに「users.xml」というファイルができあがります。
AppendChildという命令は、作成した部品を親要素にくっつける作業をしています。
5. 既存のXMLファイルを読み込む方法
次に、すでにあるXMLファイルを読み込んで、その中身を画面に表示させる方法を解説します。
Loadという命令を使うことで、指定したファイルの内容を読み込むことができます。
ファイルを読み込むときは、そのファイルが本当に存在するかどうかや、XMLの形式が正しいかどうかが重要になります。
using System;
using System.Xml;
class Program
{
static void Main()
{
XmlDocument doc = new XmlDocument();
try
{
// ファイルを読み込む
doc.Load("users.xml");
// Nameタグの情報を取得
XmlNodeList nameList = doc.GetElementsByTagName("Name");
foreach (XmlNode node in nameList)
{
Console.WriteLine("名前: " + node.InnerText);
}
}
catch (Exception ex)
{
Console.WriteLine("エラーが発生しました: " + ex.Message);
}
}
}
名前: 山田花子
GetElementsByTagNameは、指定したタグ名のリストをまるごと取ってくる命令です。
複数のデータがある場合でも、foreachという繰り返し命令を使うことで、順番に中身を取り出すことが可能です。
6. 属性(アトリビュート)の読み取り
XMLには、タグで囲まれた文字情報のほかに「属性」というデータを持たせることができます。
例えば、<User id="001">の「id="001"」の部分が属性です。
これは、その要素に関する付加的な情報を表すのに適しています。
属性を取得するには、要素をXmlElementとして扱い、GetAttributeという命令を使います。
using System;
using System.Xml;
class Program
{
static void Main()
{
XmlDocument doc = new XmlDocument();
doc.Load("users.xml");
// 全てのUser要素を取得
XmlNodeList userList = doc.GetElementsByTagName("User");
foreach (XmlNode node in userList)
{
// XmlElementに変換して属性を取り出す
XmlElement element = (XmlElement)node;
string id = element.GetAttribute("id");
Console.WriteLine("ユーザーID: " + id);
}
}
}
ユーザーID: 001
7. データの更新と値の書き換え
読み込んだXMLの一部を書き換えて、再度保存することも簡単にできます。
プログラム内で値を変更した後に、再びSave命令を呼び出すだけです。
「名前を書き換える」という処理をコードで見てみましょう。
using System;
using System.Xml;
class Program
{
static void Main()
{
XmlDocument doc = new XmlDocument();
doc.Load("users.xml");
// 最初のNameタグを見つける
XmlNode nameNode = doc.SelectSingleNode("//Name");
if (nameNode != null)
{
// 中身を書き換える
nameNode.InnerText = "佐藤太郎";
// 上書き保存
doc.Save("users.xml");
Console.WriteLine("名前を更新しました。");
}
}
}
ここで新しく出てきたSelectSingleNodeは、条件に合う要素をひとつだけ探してくる便利な命令です。
"//Name"という書き方はXPath(エックスパス)と呼ばれる、XML内の場所を指定するための特殊な書き方です。
8. 要素を新しく追加する方法
既にあるリストに、新しいユーザーを追加したい場合の手順を説明します。 まず新しい要素を作成し、それをルート要素の最後に付け足すという流れになります。
using System;
using System.Xml;
class Program
{
static void Main()
{
XmlDocument doc = new XmlDocument();
doc.Load("users.xml");
// ルート要素を取得
XmlNode root = doc.DocumentElement;
// 新しいUser要素を作成
XmlElement newUser = doc.CreateElement("User");
newUser.SetAttribute("id", "002");
XmlElement newName = doc.CreateElement("Name");
newName.InnerText = "鈴木次郎";
newUser.AppendChild(newName);
root.AppendChild(newUser);
doc.Save("users.xml");
Console.WriteLine("新しいユーザーを追加しました。");
}
}
DocumentElementというプロパティを使うと、そのXMLのルート要素(今回の場合はUsers)を直接指し示すことができます。
そこに新しいUserをAppendChildすることで、名簿の一番下に新しい人が追加されるイメージです。
9. 初心者が注意すべきポイント
XMLを扱うときによくある失敗が、ファイルのパス(場所)の間違いです。 プログラムを実行している場所と、XMLファイルが置いてある場所がズレていると「ファイルが見つかりません」というエラーが出てしまいます。
また、XMLは「大文字と小文字を区別する」というルールがあります。
<Name>と<name>は別のものとして扱われるので、注意深く記述する必要があります。
さらに、特殊な文字の扱いにも気を付けましょう。
例えば「<」や「>」といった文字をデータとしてそのまま書き込むと、タグの始まりなのか文字なのかコンピュータが混乱してしまいます。
しかし、InnerTextプロパティを使えば、C#が自動的に安全な形に変換してくれるので安心してください。
10. XMLとJSONの使い分けについて
最近ではXMLのほかに、JSON(ジェイソン)という形式もよく使われます。 JSONの方が記述がシンプルでデータ量が少なく済むため、インターネットでの通信によく使われる傾向があります。
一方、XMLは古いシステムとの連携や、文書構造を厳格に定義したい設定ファイルなどで今でも根強く使われています。 どちらが良い悪いではなく、用途に合わせて使い分けられるようになるのがプログラミング上達の近道です。
C#では今回紹介したXmlDocumentのほかにも、より新しく高速な「LINQ to XML (XDocument)」という仕組みもありますが、 まずは基本であるXmlDocumentをマスターすることで、データの構造化についての理解がぐっと深まるはずです。