C#

【C#】ちょっとした設定値をXMLに保存するクラス

C#でプログラムを作成するときに、ちょっとした設定値を保存したり、読み込んだりするクラスを毎回作成したり、思い出したりするのが大変なので、メモ程度に残しておきたいと思います。

XMLファイルの読み込み、書き込みクラス

XMLファイルの簡単な読み込み、書き込みクラスについて、下記に記載します。

処理概要

■ファイル読み込み

  • 指定したXMLファイルパスのデータを読み込む。
  • 読み込んだデータをクラスデータとして取得する。
  • ファイルの存在確認をする。
  • XMLデータとクラス構成は、一致していること。

■ファイル書き込み

  • 指定されたクラスのデータ形式で、XMLファイルを作成する。
  • 指定したパスにXMLファイルを作成する。
  • 指定したファイルパスについて、フォルダが存在しない場合は、フォルダを作成する。

プログラム

XMLファイルの読み書きクラスについて、プログラムを以下に記載いたします。

using System;
using System.IO;

/// <summary>
/// ファイル読み書き処理(XML)
/// </summary>
public class XmlReadWrite
{
    //定数
    public const int TRUE = 0;
    public const int FALSE = -1;
    public const int ERROR_FILE_NOT_EXIST = -2;     //ファイル存在無しエラー
    public const int ERROR_FILE_READ = -3;          //ファイル読込エラー
    public const int ERROR_FILE_WRITE = -4;         //ファイル書込みエラー

    /// <summary>
    /// ファイル読込処理
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="ReadData"></param>
    /// <returns></returns>
    public int ReadXml<T>(ref T ReadData, string path)
    {
        int ret = TRUE;

        if (File.Exists(path))
        {
            try
            {
                //保存した内容を復元する
                System.Xml.Serialization.XmlSerializer serializer =
                    new System.Xml.Serialization.XmlSerializer(typeof(T));
                using (System.IO.StreamReader sr = new System.IO.StreamReader(
                        path, new System.Text.UTF8Encoding(false)))
                {
                    ReadData = (T)serializer.Deserialize(sr);
                }
            }
            catch
            {
                ret = ERROR_FILE_READ;
            }
        }
        else
        {
            ret = ERROR_FILE_NOT_EXIST;
        }

        return ret;
    }

    /// <summary>
    /// ファイル書込み処理
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="WriteData"></param>
    /// <param name="path"></param>
    /// <returns></returns>
    public int WriteXml<T>(T WriteData, string path)
    {
        int ret = TRUE;

        try
        {
            //保存先フォルダの存在確認
            if (!Directory.Exists(Path.GetDirectoryName(path)))
            {
                //存在しない場合フォルダ作成
                Directory.CreateDirectory(Path.GetDirectoryName(path));
            }

            //XMLファイルに保存する
            System.Xml.Serialization.XmlSerializer serializer =
                new System.Xml.Serialization.XmlSerializer(typeof(T));
            using (System.IO.StreamWriter sw = new System.IO.StreamWriter(
                    path, false, new System.Text.UTF8Encoding(false)))
            {
                serializer.Serialize(sw, WriteData);
            }
        }
        catch (Exception e)
        {
            ret = ERROR_FILE_WRITE;
        }

        return ret;
    }
}

使用方法

作成したクラスの簡単な使用方法を以下に記載いたします。

今回は、個人情報クラスを作成して、クラスデータをXMLファイルに保存します。

/// <summary>
/// 個人情報
/// </summary>
public class PrivateInformation
{
	public string name { get; set; }
	public string address { get; set; }
	public string tel { get; set; }
}

/// <summary>
/// ファイル読み込み
/// </summary>
/// <param name="filepath">読込ファイルパス</param>
private void ReadPrivateInfo(string filepath)
{
	PrivateInformation pi = new PrivateInformation();
	XmlReadWrite xrw = new XmlReadWrite();
	int ret = xrw.ReadXml(ref pi, filepath);
	if (ret == 0)
	{
		Console.WriteLine($"名前:{pi.name}");
		Console.WriteLine($"住所:{pi.address}");
		Console.WriteLine($"電話番号:{pi.tel}");
	}
	else
	{
		Console.WriteLine($"エラー:[{ret}]");
	}
}

/// <summary>
/// ファイル書き込み
/// </summary>
/// <param name="filepath">書き込みファイルパス</param>
private void WritePrivateInfo(string filepath)
{
	PrivateInformation pi = new PrivateInformation();
	pi.name = "たま";
	pi.address = "にっぽん";
	pi.tel = "0101-2020-3030";

	XmlReadWrite xrw = new XmlReadWrite();
	int ret = xrw.WriteXml(pi, filepath);
	if (ret < 0)
	{
		Console.WriteLine($"エラー:[{ret}]");
	}
}

上記でXMLファイルを作成すると、以下のような内容のファイルが作成されます。

<?xml version="1.0" encoding="utf-8"?>
<PrivateInformation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <name>たま</name>
  <address>にっぽん</address>
  <tel>0101-2020-3030</tel>
</PrivateInformation>

使用したクラス名とクラス変数が、そのままXMLのタグになってくれるので、ちょっとした設定を保存するには、とても便利です。