tinyxml是个高效精简的xml解析开源代码.
针对tinyxml直接使用对于对xml不是很熟悉的入门新手来说,有些概念难以理解,因此我将其封装后,供大家使用.
头文件:
#include
#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"结束,否则解析失败