#include "StdAfx.h"
#include ".\xml.h"

CXML::CXML(void)
{
}

CXML::~CXML(void)
{
}

bool CXML::ParseXmlFile(const char* xmlFile) 
{ 
	return m_xml.LoadFile(xmlFile)?1:0;
} 

TiXmlElement* CXML::GetElement(const char* parentTitle,const char* title)
{
	TiXmlNode* _=m_xml.FirstChildElement(parentTitle);
	for(_=_->FirstChild();_;_=_->NextSibling())
	{
		if (!strcmp(title,_->Value()))
		{
			return _->ToElement();
		}
	}
	return 0;
}

bool CXML::getElementAttributeValue(TiXmlElement* Element,const char* AttributeName,string& reslut) 
{ 
	if(Element->Attribute(AttributeName)) 
	{ 
		reslut=Element->Attribute(AttributeName); 
		return 1;
	} 
	return 0; 
}

bool CXML::getFirstElementValue(const char* title,string& result) 
{ 
	if(!title)
		return 0;
	TiXmlElement* _(0);
	_=m_xml.RootElement();
	_=getFirstElement(title,_);
	if(_)
	{
		pElement=_;
		result=pElement->GetText();
		return 1;
	} 
	return 0;
} 

bool CXML::getNextElementValue(const char* title,string& result) 
{ 
	result=""; 
	pElement=pElement->NextSiblingElement(title); 
	if(pElement) 
	{ 
		result=pElement->GetText(); 
		return 1; 
	} 
	return 0; 
} 

TiXmlElement* CXML::getRootElement() 
{ 
	return m_xml.RootElement(); 
} 

void CXML::Clear() 
{ 
	m_xml.Clear(); 
} 

//////////////////////////////////////////////////////////////////////////
TiXmlElement* CXML::addXmlRootElement(const char* title) 
{ 
	TiXmlElement* _=new TiXmlElement(title); 
	m_xml.LinkEndChild(_); 
	return _; 
} 

TiXmlElement* CXML::addXmlChildElement(TiXmlElement* pElement,const char* title) 
{ 
	if(pElement) 
	{ 
		TiXmlElement* _=new TiXmlElement(title); 
		pElement->LinkEndChild(_); 
		return _; 
	} 
	return 0; 
} 

void CXML::addXmlAttribute(TiXmlElement* pElement,const char* name,const char* value) 
{ 
	if(pElement) 
	{ 
		pElement->SetAttribute(name,value); 
	} 
} 

void CXML::addXmlDeclaration(const char* vesion,const char* encoding,const char* standalone) 
{ 
	TiXmlDeclaration *_=new TiXmlDeclaration(vesion,encoding,standalone); 
	m_xml.LinkEndChild(_); 
} 

void CXML::addElementValue(TiXmlElement *pElement,const char* value) 
{ 
	if(pElement) 
	{ 
		TiXmlText *_=new TiXmlText(value); 
		pElement->LinkEndChild(_); 
	} 
} 
 
void CXML::addXmlComment(TiXmlElement* pElement,const char* Comment) 
{ 
	if(pElement) 
	{ 
		TiXmlComment *_=new TiXmlComment(Comment); 
		pElement->LinkEndChild(_); 
	} 
} 

void CXML::saveFile(const char* file) 
{ 
	m_xml.SaveFile(file); 
} 

//////////////////////////////////////////////////////////////////////////
TiXmlElement* CXML::getFirstElement(const char* ElementMark,TiXmlElement* pcrElement) 
{ 
	TiXmlElement* _=pcrElement;  
	while(_) 
	{ 
		if(strcmp(_->Value(),ElementMark)==0) 
		{ 
			//printf("%s\r\n",pElementtmp->Value()); 
			return _; 
		} 
		else 
		{ 
			TiXmlElement* nextElement=_->FirstChildElement(); 
			while(nextElement) 
			{ 
				//printf("%s\r\n",nextElement->Value()); 
				if(strcmp(nextElement->Value(),ElementMark)==0) 
				{ 
					return nextElement; 
				} 
				else 
				{ 
					TiXmlElement* reElement=NULL; 
					reElement=getFirstElement(ElementMark,nextElement); 
					if(reElement) 
					{ 
						return reElement; 
					} 
				} 
				nextElement=nextElement->NextSiblingElement(); 
			} 
		} 
		_=_->NextSiblingElement(); 
	} 
	return NULL; 
} 