Morning Girl

Web API, Windows, C#, .NET, Dynamics 365/CRM etc..

【C#】XMLをデシリアライズする時のクラス

CSVCRMマッピングファイルをどう構成しようかなぁとひたすら考えていました。 はじめはapp.configでマッピングファイルをつくろうと思ったんですが、CustomeConfig用クラスの作り方がいかせん理解しきれない!

orz

というわけで、XMLドキュメントを独自に作成し、そこをデータ用クラスにキャストする方法に切り替えました。(逃げ)

今回利用するXML

<?xml version="1.0" encoding="utf-8" ?>
<entity crm="account" csv="Account">
  <field crm="field1" csv="csvfield1" />
  <field crm="field2" csv="csvfield2" />
  <field crm="field3" csv="csvfield3" />
</entity>

XML用クラスの属性について

参考URL先が詳しく書いていますが、自分のためにもおさらい。 今回実装するクラスと各種フィールドにマッピング用の属性を付与します。

ライブラリ:System.Xml.Serialization

XmlRoot XMLルートエレメント(タグ)名 上記XMLでは entity

XmlElement XMLエレメント(タグ)名 上記XMLでは field 

XmlAttribute XMLエレメント(タグ)の属性(Attribute) 上記XMLでは crm=

XmlText XMLエレメントの内容(テキスト) 上では使っていないけど<tag>これ</tag>

格納用クラス

作成するクラスはEntityとFieldの2種類 ここでのミソはEntityクラスのFieldプロパティ。 List<XMLElement格納クラス>にすることで、子要素を表現しています。 すばらしい! app.configみたいに、ConfigurationCollectionとかうんちゃらかんちゃら書かなくていい!!!!! 理解しやすい! スッキリ!

using System.Xml;
using System.Xml.Serialization;
using System.Collections.Generic;

namespace MyProject.ReadXmlDocument
{
    /// <summary>
    /// Entity用クラス
    /// </summary>
    [XmlRoot("entity")]
    public class Entity
    {
        [XmlAttribute("crm")]
        public string CRM { get; set; }

        [XmlAttribute("csv")]
        public string CSV { get; set; }

        [XmlElement("field")]
        public List<Field> Field { get; set; }
    }

    /// <summary>
    /// Field用クラス
    /// </summary>
    public class Field
    {
        [XmlAttribute("crm")]
        public string CRM { get; set; }

        [XmlAttribute("csv")]
        public string CSV { get; set; }

    }
}

動作確認用コード

using System;
using System.IO;
using System.Xml.Serialization;

namespace MyProject.ReadXmlDocument
{
    class Program
    {
        static void Main(string[] args)
        {
            FileStream fs = new FileStream(@"XML\account.xml", FileMode.Open);

            XmlSerializer serializer = new XmlSerializer(typeof(Entity));

            Entity entityModel = (Entity)serializer.Deserialize(fs);

            foreach (Field fieldModel in entityModel.Field)
            {
                Console.WriteLine("EntityName : {0} , FieldName : {1}",entityModel.CRM,fieldModel.CRM);
            }
            fs.Close();

            Console.ReadKey();
        }
    }
}

実行結果

f:id:sugimomoto:20150402180845p:plain

参考URL

http://zero-config.com/dotnet/xmlserializer001.html