xmlはExtensible Markup Languageの略で、タグを利用してデータとして表現します。
例えば
<?xml version="1.0" encoding="Shift_JIS" ?>
<User>
<ID>1</ID>
<Name>Charlotte</Name>
<Age>20</Age>
<Gender>Female</Gender>
</User>
この場合Userは、IDとNameとAgeとGenderという情報を持っているということになります。
サンプルデータ
今回、設定情報が格納されているクラスオブジェクトを作成しました。
設定クラス
XMLとして出力しない場合は、[System.Xml.Serialization.XmlIgnore]属性を付けます。
注意点としてはクラスはpublicで宣言する必要があります。
public class ConfigClass
{
public string StrValue { get; set; } = ""; //文字列情報
public int NumValue { get; set; } = 0; //数値情報
public int[] ArrayValue { get; set; } //配列情報
[System.Xml.Serialization.XmlIgnore]
public string HiddenValue { get; set; } //出力しない情報
}
オブジェクト作成
private ConfigClass _config = new ConfigClass();
データ設定
//設定
_config.StrValue = "文字情報";
_config.NumValue = 9999;
_config.ArrayValue = new int[] {1, 9, 34, 332, 764};
_config.HiddenValue = "出力しない情報";
XmlSerializerを使って、XMLを書き込む
StreamWriterを使いファイル出力します。
//出力先を取得
string output_path = "";
using (SaveFileDialog dlg = new SaveFileDialog())
{
dlg.Filter = @"XML(*.xml)|*.xml";
if (dlg.ShowDialog() != DialogResult.OK)
{
//OK以外は処理を抜ける
return;
}
output_path = dlg.FileName;
}
//XmlSerializerオブジェクトを作成
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(ConfigClass));
//UTF-8 BOM無しで書き込む
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(output_path, false, new System.Text.UTF8Encoding(false)))
{
//シリアル化を行い、XMLファイルを出力する
serializer.Serialize(sw, _config);
//ファイルを閉じる
sw.Close();
}
実行結果
以下のようなXMLが出力されました。
<?xml version="1.0" encoding="utf-8"?>
<ConfigClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<StrValue>文字情報</StrValue>
<NumValue>9999</NumValue>
<ArrayValue>
<int>1</int>
<int>9</int>
<int>34</int>
<int>332</int>
<int>764</int>
</ArrayValue>
</ConfigClass>
XmlSerializerを使って、XMLを読み込む
XMLファイルをStreamReaderで読み込みます。
//XMLファイルを取得
string input_path = "";
using (OpenFileDialog dlg = new OpenFileDialog())
{
dlg.Filter = @"XML(*.xml)|*.xml";
if (dlg.ShowDialog() != DialogResult.OK)
{
//OK以外は処理を抜ける
return;
}
input_path = dlg.FileName;
}
//XmlSerializerオブジェクトを作成
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(ConfigClass));
//UTF-8 BOM無しで書き込む
using (System.IO.StreamReader sr = new System.IO.StreamReader(input_path,new System.Text.UTF8Encoding(false)))
{
//シリアル化を行い、XMLファイルを出力する
_config = serializer.Deserialize(sr) as ConfigClass;
//ファイルを閉じる
sr.Close();
}
実行結果
読込むXMLファイル
<?xml version="1.0" encoding="utf-8"?>
<ConfigClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<StrValue>読込文字情報</StrValue>
<NumValue>1234</NumValue>
<ArrayValue>
<int>9</int>
<int>11</int>
<int>5</int>
<int>4</int>
<int>76</int>
</ArrayValue>
</ConfigClass>
読込後の変数「_config 」の中身

List化されたオブジェクトのXMLファイル書込/読込
List化されたオブジェクトのXMLファイル書込
例えばリスト化されたユーザーオブジェクト(List<UserClass>)をXML出力する場合は、出力typeを合わせてあげればよいです。以下に例を表示します。
配列で出力したい場合も同様にtypeof(UserClass[])とすればできます。
//XmlSerializerオブジェクトを作成
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(List<UserClass>));
//UTF-8 BOM無しで書き込む
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(output_path, false, new System.Text.UTF8Encoding(false)))
{
//シリアル化を行い、XMLファイルを出力する
serializer.Serialize(sw, _user_list);
//ファイルを閉じる
sw.Close();
}
出力結果

List化されたオブジェクトのXMLファイル読込
書込み時と同様にtypeを合わせます。
List<UserClass> user_list;
//XmlSerializerオブジェクトを作成
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(List<UserClass>));
//UTF-8 BOM無しで書き込む
using (System.IO.StreamReader sr = new System.IO.StreamReader(input_path, new System.Text.UTF8Encoding(false)))
{
//シリアル化を行い、XMLファイルを出力する
user_list = serializer.Deserialize(sr) as List<UserClass>;
//ファイルを閉じる
sr.Close();
}
読込結果

まとめ
今回はクラスオブジェクトをそのままXMLとして出力し、そのまま読み込むことができました。
とても便利です。
この方法、私はユーザーごとに設定が違う場合に利用しています。例えばインターネットを使うアプリでプロキシ情報を保存/読込するなどです。
この記事が皆様のお役に立てれば幸いです。


コメント