XMLArray属性とXMLArrayItem属性を使い、階層化された繰り返し要素の構造を持つXMLファイルをでシリアライズする方法です
これまでXMLをデシリアライズする記事をこれまでいくつか書いてきました。
- [.NET][C#]XMLをクラスに変換する/クラスをXMLに変換する | ごった煮 – tips about programming and building a server
- 属性とテキストで構成されるXMLタグをデシリアライズする為のクラス設計 – Zero Configuration
このページでは、System.Xml.Serialization.XmlArray属性を使って、階層化された繰返し要素のXMLをデシリアライズしてみます
読み込むXML
本サンプルコードが読み込むXMLファイルの内容は以下の通りです(ファイル名 system-config.xmlとします)
<?xml version="1.0" encoding="utf-8"?> <system-config> <system-name>XXXXX</system-name> <version>1.1</version> <users> <user id="0001"> <email>foo@example.com</email> <expired>2015/12/31</expired> </user> <user id="0002"> <email>bar@example.com</email> <expired>2015/09/30</expired> </user> </users> </system-config>
システム名とバージョン、されに、利用可能なユーザ情報が定義されているXMLファイルです。
XMLルートタグ”system-config”の下に、繰返し要素の親タグ”users”があり、”user”タグが繰返し定義される形です。
UsersクラスとUserクラスを作れば、繰返し部分はなんとなくデシリアライズできそうですが、XMLArray属性とXMLArrayItem属性を使えばUserクラスだけでデシリアライズできます
クラス設計
クラスは以下の2つになります。
- SystemConfigクラス
- Userクラス
SystemConfigクラスに以下のプロパティを用意します
- SystemName
- Version
- Users ※List
また、Userクラスは以下のプロパティを持ちます
- Id
- Expired
2つのクラスのコードは以下となります。
SystemConfigクラス
namespace Sample.Model { /// <summary> /// システム設定 /// </summary> [System.Xml.Serialization.XmlRoot("system-config")] public class SystemConfig { /// <summary> /// システム名 /// </summary> [System.Xml.Serialization.XmlElement("system-name")] public string SystemName {get; set;} /// <summary> /// バージョン /// </summary> [System.Xml.Serialization.XmlElement("version")] public string Version { get; set; } /// <summary> /// ユーザ情報 /// </summary> [System.Xml.Serialization.XmlArray("users")] [System.Xml.Serialization.XmlArrayItem("user")] public List<Sample.Model.User> Users { get; set; } } }
ポイントは、プロパティ”Users”を定義している
[System.Xml.Serialization.XmlArray("users")] [System.Xml.Serialization.XmlArrayItem("user")] public List<Sample.Model.User> Users { get; set; }
です。
XmlArray属性とXmlArray属性を指定して、階層化された繰返し構造を表現しています
続いてUserクラスです。
Userクラス
namespace Sample.Model { /// <summary> /// ユーザ情報 /// </summary> [Serializable] public class User { /// <summary> /// ID /// </summary> [System.Xml.Serialization.XmlAttribute("id")] public string Id { get; set; } /// <summary> /// メールアドレス /// </summary> [System.Xml.Serialization.XmlElement("email")] public string MailAddress {get; set;} /// <summary> /// 有効期限 /// </summary> [System.Xml.Serialization.XmlElement("expired")] public string Expired { get; set; } } }
デシリアライズするコード
デシリアライズするコードは以下となります
System.IO.FileStream fs = new System.IO.FileStream(@"system-config.xml", System.IO.FileMode.Open); System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(Sample.Model.SystemConfig)); Sample.Model.SystemConfig configModel = (Sample.Model.SystemConfig)serializer.Deserialize(fs); Console.WriteLine(String.Format("SYSTEM={0}, Version={1}", configModel.SystemName, configModel.Version)); foreach (Sample.Model.User userModel in configModel.users) { Console.WriteLine(String.Format("ID={0}, EMAIL={1}, EXPIRED={2}", userModel.Id, userModel.MailAddress, userModel.Expired)); } fs.Close();
実行結果
SYSTEM=XXXXX, Version=1.1 ID=0001, EMAIL=foo@example.com, EXPIRED=2015/12/31 ID=0002, EMAIL=bar@example.com, EXPIRED=2015/09/30
はい。うまくデシリアライズできました