【C# Xml】XmlSerializerでXMLファイルの読み書き

本記事では、C# において、XmlSerializerでXMLファイルの読み込み、書き込みを行う方法を書きます。

XMLファイルの読み書きをする場合は、XmlSerializerが便利です。

あわせて読みたい
XmlSerializer クラス (System.Xml.Serialization) オブジェクトから XML ドキュメントへのシリアル化および XML ドキュメントからオブジェクトへの逆シリアル化を実行します。 XmlSerializer により、オブジ...

XmlSerializerを使うと、クラスオブジェクトとXMLファイルの相互変換が簡単にできます。

今後、XMLファイルと相互変換するオブジェクトのクラスを、Xmlクラスと呼びます。↑図では、AdministratorXmlクラスが該当します。

開発環境
  • Windows10
  • Microsoft Visual Studio Community2022
  • .NET 6
目次

Xmlクラス

AdministratorXmlクラス( 管理者クラス ) を例にして説明します。XMLファイルと対応するAdministratorXmlクラスは以下のようになります。

namespace XmlProject
{
    /// <summary>
    /// 管理者Xml
    /// </summary>
    public class AdministratorXml
    {
        /// <summary>ID</summary>
        public string id;

        /// <summary>パスワード</summary>
        public string pass;

        /// <summary>年齢</summary>
        public int age;

        /// <summary>年齢表示判定</summary>
        public bool isViewAge;

        /// <summary>役職</summary>
        public string position;

        public AdministratorXml()
        {
            id = "admin";
            pass = "admin";
            age = 30;
            isViewAge = false;
            position = "未設定";
        }
    }
}

Xmlクラスは以下の制約があります。

Xmlクラスの制約
  • public クラスとする
  • メンバ変数はpublicとする
  • publicで引数のないコンストラクタを実装する

メンバ変数のpublic が制約となっているので、オブジェクト指向のカプセル化の観点から見ると、あまりいいクラスとはいえません。このクラスは、Xmファイルとの相互変換に特化したほうがいいです

XMLファイルに保存する

それでは、XmlクラスのオブジェクトをXMLファイルに保存する処理を見ていきます。

XMLファイルに保存するクラス

XmlSaverクラスのSaveメソッドで保存をします。SaveメソッドはXmlSerializerを使用します。

using System.Text;
using System.Xml.Serialization;

namespace XmlProject
{
    /// <summary>
    /// Xmlセーバー
    /// </summary>
    public class XmlSaver
    {
        /// <summary>
        /// XMLファイルに保存する
        /// </summary>
        /// <typeparam name="T">型</typeparam>
        /// <param name="xml">Xmlとして保存するクラス</param>
        /// <param name="filePath">保存するファイルパス</param>
        public static void Save<T>(T xml, string filePath)
        {
            //XmlSerializerオブジェクトを作成
            XmlSerializer serializer = new XmlSerializer(typeof(T));

            //書き込むファイルを開く(UTF-8 BOM無し)
            using (StreamWriter sw = new StreamWriter(filePath, false, new UTF8Encoding(false)))
            {
                //シリアル化し、XMLファイルに保存する
                serializer.Serialize(sw, xml);
            }
        }
    }
}

保存実行

XSaverを使ってXmlクラスのオブジェクトを保存するコードです。

using XmlProject;

AdministratorXml administratorXml = new AdministratorXml();
administratorXml.id = "abc";
administratorXml.pass = "abc";
administratorXml.age = 35;
administratorXml.isViewAge = true;

string filePath = Environment.CurrentDirectory + "/AdministratorXml.xml";
XmlSaver.Save(administratorXml, filePath);

コードを実行すると、カレントディレクトリに以下のファイルを保存できました。

上記コードでは、AdministratorXmlクラスにposition は設定していません。コンストラクタで設定した値が初期値として、XMLファイルに保存されています。

XMLファイルから読み込む

次はXMLファイルを読み込み、Xmlクラスのオブジェクトに設定します。

XMLファイル

読み込むAdministratorXml.xmlファイルです。id、pass、age、isViewAge はコンストラクタと値を変えています。positionは未設定です。

Xmlを読み込むクラス

Xmlを読み込むクラスXmlLoader です。Load関数でXmlSerializer を使用します。

using System.Text;
using System.Xml.Serialization;

namespace XmlProject
{
    /// <summary>
    /// Xmlローダー
    /// </summary>
    internal class XmlLoader
    {
        // XMLファイルをロードする
        public static T Load<T>(string path) where T : new()
        {
            //XmlSerializerオブジェクトを作成
            XmlSerializer serializer = new XmlSerializer(typeof(T));

            //読み込むファイルを開く
            using (StreamReader sr = new StreamReader(path, new UTF8Encoding(false)))
            {
                //XMLファイルから読み込み、逆シリアル化する
                T t = (T?)serializer.Deserialize(sr) ?? throw new Exception();
                return t;
            }
        }
    }
}

引数にXMLファイルのパスを設定します。戻り値は、Xmlを読み込んだクラスオブジェクトです。

読み込み実行

動作確認をしてみます。Administrator.xmlから読み込んだデータをコンソールに表示します。

例外処理は割愛します。

using XmlProject;

string filePath = Environment.CurrentDirectory + "/administratorXml.xml";
AdministratorXml administratorXml = XmlLoader.Load<AdministratorXml>(filePath);

Console.WriteLine(" ID= " + administratorXml.id);
Console.WriteLine(" パスワード= " + administratorXml.pass );
Console.WriteLine(" 年齢= " + administratorXml.age );
Console.WriteLine(" 年齢表示判定= " + administratorXml.isViewAge );
Console.WriteLine(" 役職= " + administratorXml.position);

実行した結果です。

XMLファイルで設定した値を出力しています。

XMLファイルには役職タグが設定されていませんでした。コンソールの出力は、役職=未設定 となっております。Administratorクラスのコンストラクタで設定した値となっています

まとめ

本記事では、C# において、XmlSerializerでXMLファイルの読み書きする方法を書きました。

XMLファイルの読み書きをする場合は、XmlSerializerが便利です。

XmlSerializerを使うと、クラスオブジェクトとXMLファイルの相互変換ができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次