tinyxml的封装与使用(转载)

tinyxml是个高效精简的xml解析开源代码.

针对tinyxml直接使用对于对xml不是很熟悉的入门新手来说,有些概念难以理解,因此我将其封装后,供大家使用.

头文件:

#include "tinystr.h"
#include "tinyxml.h"

using namespace std; 

class CXML

{

public:

CXML(void)

{

}

~CXML(void)

{

}

private:

TiXmlDocument m_xml;

TiXmlElement* pElement;

private:

TiXmlElement* getFirstElement(string ElementMark,TiXmlElement* pcrElement);

public:

//解析xml字符串

int ParseXmlStr(string xmlstr);

//解析xml文件

int ParseXmlFile(string xmlFile);

//根据标签取值

int getFirstElementValue(string ElementMark,string& value);

//针对同一标签的记录取值,如果返回值是0表明再无此标签内容值可取

int getNextElementValue(string ElementMark,string& value);

 

//取得属性值

int getElementAttributeValue(string AttributeName,string& value);

//获取根结点

TiXmlElement* getRootElement();

//返回当前的xml字符串

string getXmlStr(); 

//清空解析的内容

void Clear();

//添加子节点

TiXmlElement* addXmlRootElement(string ElementMark);//添加一个根节点

//添加子节点

TiXmlElement* addXmlChildElement(TiXmlElement* pElement,string ElementMark);

//给节点添加值

void addElementValue(TiXmlElement* pElement,string value);

//添加属性及属性值

void  addXmlAttribute(TiXmlElement* pElement,string AttributeMark,string value);

//添加声明

void  addXmlDeclaration(string vesion,string encoding,string standalone);

//添加注释

void  addXmlComment(TiXmlElement* pElement,string Comment);

//将xml内容保存到文件

void  saveFile(string FileName);

};

///////////////////实现文件

 

#include "XML.h"

 

int CXML::ParseXmlFile(string xmlFile)

{

int result=0;

try

{

if(m_xml.LoadFile(xmlFile.c_str()))

result=1;

else

result=0;

}

catch(...)

{

}

return result;

}

 

int CXML::ParseXmlStr(std::string  xmlStr)

{

int result=0;

if(xmlStr=="")

return 0;

try

{

if(m_xml.Parse(xmlStr.c_str()))

result=1;

else

result=0;

}

catch(...)

{

}

return result;

}

TiXmlElement* CXML::getFirstElement(string ElementMark,TiXmlElement* pcrElement)

{

TiXmlElement* pElementtmp=NULL;

pElementtmp=pcrElement;

while(pElementtmp)

{

if(strcmp(pElementtmp->Value(),ElementMark.c_str())==0)

{

//printf("%s\r\n",pElementtmp->Value());

return pElementtmp;

}

else

{

TiXmlElement* nextElement=pElementtmp->FirstChildElement();

while(nextElement)

{

//printf("%s\r\n",nextElement->Value());

if(strcmp(nextElement->Value(),ElementMark.c_str())==0)

{

return nextElement;

}

else

{

TiXmlElement* reElement=NULL;

reElement=getFirstElement(ElementMark,nextElement);

if(reElement)

{

return reElement;

}

}

nextElement=nextElement->NextSiblingElement();

}

}

pElementtmp=pElementtmp->NextSiblingElement();

}

return NULL;

}

 

//根据标签取值

int CXML::getFirstElementValue(string ElementMark,string& value)

{

int result=0;

if(ElementMark=="")

return 0;

try

{

TiXmlElement* pcrElement=NULL;

pcrElement=m_xml.RootElement();

pcrElement=this->getFirstElement(ElementMark,pcrElement);

if(pcrElement)

{

this->pElement=pcrElement;

value=this->pElement->GetText();

result=1;

}

}

catch(...)

{

}

return result;

}

 

int CXML::getNextElementValue(string ElementMark,string& value)

{

value="";

this->pElement=this->pElement->NextSiblingElement(ElementMark.c_str());

if(this->pElement)

{

value=this->pElement->GetText();

return 1;

}

return 0;

}  

 

string CXML::getXmlStr()

{

string result="";

try

{

TiXmlPrinter printer;

m_xml.Accept(&printer);

result=printer.CStr();

}

catch(...)

{

}

return result;

}

void CXML::Clear()

{

m_xml.Clear();

}

//添加子节点

TiXmlElement* CXML::addXmlRootElement(string ElementMark)

{

TiXmlElement* RootElement=new TiXmlElement(ElementMark.c_str());

m_xml.LinkEndChild(RootElement);

return RootElement;

}

TiXmlElement* CXML::addXmlChildElement(TiXmlElement* pElement,string ElementMark)

{

if(pElement)

{

TiXmlElement* tempElement=new TiXmlElement(ElementMark.c_str());

pElement->LinkEndChild(tempElement);

return tempElement;

}

return 0;

}

void CXML::addElementValue(TiXmlElement *pElement, std::string value)

{

if(pElement)

{

TiXmlText  *pContent=new TiXmlText(value.c_str());

pElement->LinkEndChild(pContent);

}

}

//添加属性及属性值

void  CXML::addXmlAttribute(TiXmlElement* pElement,string AttributeMark,string value)

{

if(pElement)

{

pElement->SetAttribute(AttributeMark.c_str(),value.c_str());

}

}

//添加声明

void  CXML::addXmlDeclaration(string vesion,string encoding,string standalone)

{

TiXmlDeclaration *pDeclaration=new TiXmlDeclaration(vesion.c_str(),encoding.c_str(),standalone.c_str());

m_xml.LinkEndChild(pDeclaration);

}

//添加注释

void  CXML::addXmlComment(TiXmlElement* pElement,string Comment)

{

if(pElement)

{

TiXmlComment *pComment=new TiXmlComment(Comment.c_str());

pElement->LinkEndChild(pComment);

}

}

 

TiXmlElement* CXML::getRootElement()

{

return m_xml.RootElement();

}

 

//取得属性值

int CXML::getElementAttributeValue(string AttributeName,string& value)

{

if(this->pElement->Attribute(AttributeName.c_str()))

{

value=this->pElement->Attribute(AttributeName.c_str());

return 1;

}

return 0;

}

void CXML::saveFile(string FileName)

{

this->m_xml.SaveFile(FileName.c_str());

}

 

 

 


 

注意:

      xml字符串如果不是从文件中读出,那么必须以"\r\n"结束,否则解析失败

posted @ 2015-07-01 21:39  繁华如梦  阅读(511)  评论(0编辑  收藏  举报