本記事では、C# において、XmlSerializerで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クラスは以下の制約があります。
- 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ファイルの相互変換ができます。
コメント