#ifndef __MyuXmlElement_H__
#define __MyuXmlElement_H__

#pragma warning( disable : 4786 ) // VC での警告を取り除きます。
#include <string>
#include <vector>
//using namespace std;

//	エラーの文字群
#define XML_ELEMENT_ERR_CHARS		"<>\"\\ /=#$^~|[]{}?!+*@'`;"
#define XML_DATA_ERR_CHARS			"<"
#define XML_ATTRNAME_ERR_CHARS		XML_ELEMENT_ERR_CHARS	//	要素の奴と同じ
#define XML_ATTRDATA_ERR_CHARS		"<\""

////////////////////////////
//
//		クラス宣言
//
class CMyuXmlElement
{
protected:
	//	attribute構造体
	typedef	struct {
		std::string	name;
		std::string	data;
	} attribute_t;

	std::string m_strElementName;
	std::string m_strData;
	std::vector<attribute_t>	m_attribute_list;			//	attributeの動的配列
	std::vector<CMyuXmlElement> m_child_element_list;	//	子要素の動的配列

public:
	//	コンストラクタ/デストラクタ
	CMyuXmlElement(){}
	virtual ~CMyuXmlElement(){}

	//	初期化
	void Clear(){
		m_strElementName="";
		m_strData="";
		m_attribute_list.clear();
		m_child_element_list.clear();
	}

	//	設定/追加系メソッド
	bool SetElementName( const char* szElementName );
	bool SetData( const char* szData );
	bool AddAttr( const char* szAttrName, const char* szAttrData );
	CMyuXmlElement* AddChild(){
		CMyuXmlElement elemTemp;
		return AddChild(elemTemp);
	}
	CMyuXmlElement* AddChild( CMyuXmlElement &child_element ){
		m_child_element_list.push_back(child_element);
		return &m_child_element_list[ m_child_element_list.size()-1 ];
	}

	//	取得系メソッド（拡張用）
	int get_last_element_index(){ return m_child_element_list.size()-1; }
	CMyuXmlElement* get_child_element( int index ){ return &m_child_element_list[index]; }

	//int get_data();
	//int delete_attribute( const char* name, const char* data );
	//int delete_child_element( MyuXmlElement* child_element );

	//	XMLの出力
	bool WriteXml( FILE *fp, int depth=0 );
};

#endif//__MyuXmlElement_H__

