カテゴリ: C# 更新日: 2026/03/07

C#でXMLを扱う基本!XmlDocumentの使い方と読み込み・保存を徹底解説

C#でXMLを扱う基本!XmlDocumentの使い方を解説
C#でXMLを扱う基本!XmlDocumentの使い方を解説

先生と生徒の会話形式で理解しよう

生徒

「C#でデータの保存をしたいのですが、XMLという形式が良いと聞きました。どうやって操作すればいいですか?」

先生

「XMLは、タグを使ってデータを構造化して管理する便利な形式です。C#ではXmlDocumentクラスを使うのが基本ですよ。」

生徒

「初心者でも簡単にデータの読み込みや書き換えができるでしょうか?」

先生

「もちろんです!まずはXMLの構造を知ることから始めて、少しずつコードを書いていきましょう。」

1. XMLとは何かを理解しよう

1. XMLとは何かを理解しよう
1. XMLとは何かを理解しよう

プログラミングの世界では、データを保存したり他のプログラムに受け渡したりする際に、特定の形式を使います。その代表的なものがXML(エックスエムエル)です。 XMLは「Extensible Markup Language」の略で、日本語では「拡張可能なマークアップ言語」と呼ばれます。

「マークアップ」とは、文章の中に「ここからここまでは名前です」「ここからここまでは値段です」という印をつけることです。 例えば、料理のレシピをデータにする場合、料理名や材料、作り方を特定のタグで囲んで表現します。 パソコンを初めて触る方でもイメージしやすいように例えると、書類を整理する際の「見出し付きのクリアファイル」のようなものです。

XMLの最大の特徴は、人間が見ても内容が理解しやすく、同時にコンピュータにとっても解析しやすいという点にあります。 C#というプログラミング言語では、このXMLを自由に操るための道具が最初から用意されています。

2. XMLの基本構造とタグの役割

2. 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クラスとは?

3. XmlDocumentクラスとは?
3. XmlDocumentクラスとは?

C#でXMLを読み書きする際に、古くから使われている最も基本的な方法がXmlDocument(アイエムエル・ドキュメント)クラスです。 これは、XMLファイルの内容をパソコンのメモリ上に「家系図」のようなツリー構造として展開して保持する仕組みです。

この仕組みを専門用語で「DOM(ドム)」と呼びます。DOMは「Document Object Model」の略で、ドキュメントを物体(オブジェクト)として扱うモデルのことです。 一度メモリに読み込んでしまえば、特定の場所にあるデータを探したり、内容を書き換えたり、新しく項目を追加したりすることが非常に簡単に行えます。

初心者の方が最初につまずきやすいのが、「クラス」という言葉ですが、これは「便利な道具箱」だと思ってください。 XmlDocumentという道具箱の中には、XMLを読み込むためのスイッチや、保存するためのボタンが入っているのです。

4. XMLファイルを新しく作成して保存する方法

4. 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ファイルを読み込む方法

5. 既存のXMLファイルを読み込む方法
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. 属性(アトリビュート)の読み取り

6. 属性(アトリビュート)の読み取り
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. データの更新と値の書き換え

7. データの更新と値の書き換え
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. 要素を新しく追加する方法

8. 要素を新しく追加する方法
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. 初心者が注意すべきポイント

9. 初心者が注意すべきポイント
9. 初心者が注意すべきポイント

XMLを扱うときによくある失敗が、ファイルのパス(場所)の間違いです。 プログラムを実行している場所と、XMLファイルが置いてある場所がズレていると「ファイルが見つかりません」というエラーが出てしまいます。

また、XMLは「大文字と小文字を区別する」というルールがあります。 <Name><name>は別のものとして扱われるので、注意深く記述する必要があります。

さらに、特殊な文字の扱いにも気を付けましょう。 例えば「<」や「>」といった文字をデータとしてそのまま書き込むと、タグの始まりなのか文字なのかコンピュータが混乱してしまいます。 しかし、InnerTextプロパティを使えば、C#が自動的に安全な形に変換してくれるので安心してください。

10. XMLとJSONの使い分けについて

10. XMLとJSONの使い分けについて
10. XMLとJSONの使い分けについて

最近ではXMLのほかに、JSON(ジェイソン)という形式もよく使われます。 JSONの方が記述がシンプルでデータ量が少なく済むため、インターネットでの通信によく使われる傾向があります。

一方、XMLは古いシステムとの連携や、文書構造を厳格に定義したい設定ファイルなどで今でも根強く使われています。 どちらが良い悪いではなく、用途に合わせて使い分けられるようになるのがプログラミング上達の近道です。

C#では今回紹介したXmlDocumentのほかにも、より新しく高速な「LINQ to XML (XDocument)」という仕組みもありますが、 まずは基本であるXmlDocumentをマスターすることで、データの構造化についての理解がぐっと深まるはずです。

カテゴリの一覧へ
新着記事
New1
C#
C#でXMLを扱う基本!XmlDocumentの使い方と読み込み・保存を徹底解説
New2
C#
C#で日付操作の落とし穴と注意点を解説|初心者向けにわかりやすく丁寧に解説
New3
COBOL
COBOLのソース管理ツール(Git・SVN)の基本を完全解説!初心者でもわかるバージョン管理入門
New4
C#
C#でタイムスタンプの精度を上げるためのテクニックを徹底解説!(初心者向け)
人気記事
No.1
Java&Spring記事人気No1
C#
C#のLINQでFirstとFirstOrDefaultの違いと使い方を完全解説!初心者向けガイド
No.2
Java&Spring記事人気No2
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.3
Java&Spring記事人気No3
C#
C#のstaticクラスとstaticメソッドの基本と使い方をやさしく解説!
No.4
Java&Spring記事人気No4
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.5
Java&Spring記事人気No5
C#
C#の引数と戻り値の基本!値を受け渡し・返す仕組みを理解しよう
No.6
Java&Spring記事人気No6
C#
C#で型を調べる方法!GetType()・typeof演算子の違いと使い方
No.7
Java&Spring記事人気No7
COBOL
COBOLのCOPY句の使い方を完全ガイド!初心者でもわかる共通部品の再利用方法
No.8
Java&Spring記事人気No8
C#
C#のCancellationTokenを使ったキャンセル処理を完全ガイド!非同期処理を安全に止める方法