C#メモ – xml読み込みの汎用化

Posted: 2015年5月14日 カテゴリー: プログラミングメモ, C# メモ
タグ:, , ,

近況報告: Psmで新作リジェクトされました! orz

 

 

・・・は置いといて、今回はxmlを読み込み、一つのクラスか構造体の配列を保存する時に使う処理を少し使い回す方法を紹介します。今回はXNAが関係無いので、C#メモ扱いにしています。

 

まずはxmlを読み込み、配列を保存するクラスの宣言をします。

 

 

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

public class XmlTable<T> where T : class, new()
{
    // XMLファイルの拡張子
    public const string _FILE_EXTENSION = ".xml";

    protected T[] m_data;

    public XmlTable()
    {
        m_data = null;
    }

 

 

Generic(T)の部分に読み込むデータの型を指定し、変数としてその型の配列を保存しています。今回はxml前提で作成していますので、拡張子名も設定しています。

 

 

それでは次は読み込む処理です。やる事はファイルを読み込み、XmlSerializerを使用して上記で指定したデータ型の配列に変換するだけです。

 

 

    public virtual void Load(string filepath, string extention = _FILE_EXTENSION)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(T[]));
        System.IO.FileStream fileStream = System.IO.File.OpenRead(filepath + extention);
        m_data = (serializer.Deserialize(fileStream) as T[]);
        fileStream.Close();
    }

 

 

読み込みが終わりましたので、読み込んだデータを獲得する処理を作ります。

 

 

    public T GetData(int index)
    {
        if (m_data == null)
        {
            return null;
        }

        int length = m_data.Length;
        if (index < 0 || index >= length)
        {
            return null;
        }

        return m_data[index];
    }

 

 

後は実際に使用するだけです。やる事はデータ型の宣言、XmlTableクラスのインスタンス化、Load()処理を呼び、データを獲得します。

 

 

    public class CharaData
    {
        public int ID = -1;
        public string Name = "";
        public float MoveSpeed = 0.0f;
        public int SheetSizeX = 1;
        public int SheetSizeY = 1;
        public float AnimationTime = 0.0f;
    }

XmlTable<CharaData> m_charaTable;

        public void Load()
        {
            // インスタンス生成
            m_charaTable = new XmlTable<CharaData>();

            // 読み込み
            m_charaTable.Load( GetTablePath() );

            // データ獲得
            CharaData data = m_charaTable.GetData(0);
        }

 

 

以上です。今回は素のままの使用法を紹介しましたが、自分で使う場合はそのまま使う時と、これを継承して個別のデータ獲得方法を作ったりして使用しています。

 

 

    public class CharaDataTable
        : XmlTable<CharaData>
    {
        public CharaDataTable()
            : base()
        {
        }

        public CharaData FindData(int charaID)
        {
            int size = m_data.Length;
            for (int i = 0; i < size; ++i)
            {
                if (m_data[i].ID== charaID)
                {
                    return m_data[i];
                }
            }

            return null;
        }

 

 

今回はここまでです。一応ソース置いておきます:

そーす

コメントを残す