tinyxml2库的使用

来源:互联网 发布:java购物车实现思路 编辑:程序博客网 时间:2024/06/08 16:14

TinyXML2概述

TinyXML2是simple、small、efficient开源的C++ XML文件解析库

  • 优点:(1)对大部分的C/C++项目具有普适性。(2)使用较少的内存,速度变得更快。(3)没有C++的STL要求。(4)更接近现代C++的特性,使用了适当的名称空间。(5)适当有效处理了空白字符。

  • 使用方法:将tinyxml2.cpp和tinyxml2.h拷贝至项目目录,使用时包含#include “tinyxml2.h”和using namespace tinyxml2。

操作xml文件

  • 实现如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><DBUSER>    <User Name=”lvlv” Password =”123456”>    <Gender></Gender>    <Mobile ></ Mobile>    <Email ></ Email ></User>...<DBUSER>

创建XML文件

//function:create a xml file//param:xmlPath:xml文件路径//return:0,成功,非0,失败int createXML(const char* xmlPath){    const char* declaration ="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>";    XMLDocument doc;    doc.Parse(declaration);//会覆盖xml所有内容    //添加申明可以使用如下两行    //XMLDeclaration* declaration=doc.NewDeclaration();    //doc.InsertFirstChild(declaration);    XMLElement* root=doc.NewElement("DBUSER");    doc.InsertEndChild(root);    return doc.SaveFile(xmlPath);}创建结果:<?xml version="1.0" encoding="UTF-8" standalone="no"?><DBUSER/>

增加xml文件的节点

//用户类class User{public:    User(){        gender=0;    };    User(const string& userName, const string& password, int gender, const string& mobile, const string& email){        this->userName=userName;        this->password=password;        this->gender=gender;        this->mobile=mobile;        this->email=email;    };    string userName;    string password;    int gender;    string mobile;    string email;};//function:insert XML node//param:xmlPath:xml文件路径; user:用户对象//return:0:成功; 非0:失败int insertXMLNode(const char* xmlPath,const User& user){    XMLDocument doc;    int res=doc.LoadFile(xmlPath);    if(res!=0)    {        cout<<"load xml file failed"<<endl;        return res;    }    XMLElement* root=doc.RootElement();    XMLElement* userNode = doc.NewElement("User");    userNode->SetAttribute("Name",user.userName.c_str());    userNode->SetAttribute("Password ",user.password.c_str());    root->InsertEndChild(userNode);    XMLElement* gender = doc.NewElement("Gender");    XMLText* genderText=doc.NewText(itoa(user.gender));    gender->InsertEndChild(genderText);    userNode->InsertEndChild(gender);    XMLElement* mobile = doc.NewElement("Mobile");    mobile->InsertEndChild(doc.NewText(user.mobile.c_str()));    userNode->InsertEndChild(mobile);    XMLElement* email = doc.NewElement("Email");    email->InsertEndChild(doc.NewText(user.email.c_str()));    userNode->InsertEndChild(email);    return doc.SaveFile(xmlPath);}创建结果:<?xml version="1.0" encoding="UTF-8" standalone="no"?><DBUSER>    <User Name="lvlv" Password ="12346">        <Gender>1</Gender>        <Mobile>15813354926</Mobile>        <Email>1589276509@qq.com</Email>    </User></DBUSER>

查询xml文件的指定节点

Xml文件中,一个用户节点存储一个用户的信息。因此,对用户信息的增删查改,即无论查询节点、删除节点、修改节点和增加节点,都需要获取需要操作的节点。那么先实现一个根据用户名获取节点指针的函数://function:根据用户名获取用户节点//param:root:xml文件根节点;userName:用户名//return:用户节点XMLElement* queryUserNodeByName(XMLElement* root,const string& userName){    XMLElement* userNode=root->FirstChildElement("User");    while(userNode!=NULL)    {        if(userNode->Attribute("Name")==userName)            break;        userNode=userNode->NextSiblingElement();//下一个兄弟节点    }    return userNode;}在以上函数的基础上,获取用户信息的函数:User* queryUserByName(const char* xmlPath,const string& userName){    XMLDocument doc;    if(doc.LoadFile(xmlPath)!=0)    {        cout<<"load xml file failed"<<endl;        return NULL;    }    XMLElement* root=doc.RootElement();    XMLElement* userNode=queryUserNodeByName(root,userName);    if(userNode!=NULL)  //searched successfully    {        User* user=new User();        user->userName=userName;        user->password=userNode->Attribute("Password");        XMLElement* genderNode=userNode->FirstChildElement("Gender");        user->gender=atoi(genderNode->GetText());        XMLElement* mobileNode=userNode->FirstChildElement("Mobile");        user->mobile=mobileNode->GetText();             XMLElement* emailNode=userNode->FirstChildElement("Email");        user->email=emailNode->GetText();                   return user;    }    return NULL;}

修改xml文件的指定节点

//function:修改指定节点内容//param:xmlPath:xml文件路径;user:用户对象//return:boolbool updateUser(const char* xmlPath,User* user){    XMLDocument doc;    if(doc.LoadFile(xmlPath)!=0)    {        cout<<"load xml file failed"<<endl;        return false;    }    XMLElement* root=doc.RootElement();    XMLElement* userNode=queryUserNodeByName(root,user->userName);    if(userNode!=NULL)    {        if(user->password!=userNode->Attribute("Password"))        {            userNode->SetAttribute("Password",user->password.c_str());  //修改属性        }        XMLElement* genderNode=userNode->FirstChildElement("Gender");        if(user->gender!=atoi(genderNode->GetText()))          {            genderNode->SetText(itoa(user->gender).c_str());   //修改节点内容        }        XMLElement* mobileNode=userNode->FirstChildElement("Mobile");        if(user->mobile!=mobileNode->GetText())        {            mobileNode->SetText(user->mobile.c_str());        }        XMLElement* emailNode=userNode->FirstChildElement("Email");        if(user->email!=emailNode->GetText())        {            emailNode->SetText(user->email.c_str());        }        if(doc.SaveFile(xmlPath)==0)            return true;    }    return false;}验证代码:int main(int argc,char* argv[]){    //修改用户信息    User user("lvlv","00001111",0,"13995648666","1586666@qq.com");    if(updateUser("./user.xml",&user))        cout<<"update successfully"<<endl;    else        cout<<"update failed"<<endl;    return 0;}修改结果:<?xml version="1.0" encoding="UTF-8" standalone="no"?><DBUSER>    <User Name="lvlv" Password="00001111">        <Gender>0</Gender>        <Mobile>13995648666</Mobile>        <Email>1586666@qq.com</Email></User></DBUSER>

删除xml文件的指定节点信息

//function:删除指定节点内容//param:xmlPath:xml文件路径;userName:用户名称//return:boolbool deleteUserByName(const char* xmlPath,const string& userName){    XMLDocument doc;    if(doc.LoadFile(xmlPath)!=0)    {        cout<<"load xml file failed"<<endl;        return false;    }    XMLElement* root=doc.RootElement();    //doc.DeleteNode(root);//删除xml所有节点    XMLElement* userNode=queryUserNodeByName(root,userName);    if(userNode!=NULL)    {        userNode->DeleteAttribute("Password");//删除属性        XMLElement* emailNode=userNode->FirstChildElement("Email");        userNode->DeleteChild(emailNode); //删除指定节点        //userNode->DeleteChildren();//删除节点的所有孩子节点        if(doc.SaveFile(xmlPath)==0)            return true;    }    return false;}验证代码:int main(int argc,char* argv[]){    //删除用户某些信息    if(deleteUserByName("./user.xml","lvlv"))        cout<<"delete successfully"<<endl;    else        cout<<"delete failed"<<endl;    return 0;}删除结果:<?xml version="1.0" encoding="UTF-8" standalone="no"?><DBUSER>    <User Name="lvlv">        <Gender>10</Gender>        <Mobile>13995648666</Mobile></User></DBUSER>

获取xml文件声明

//function:获取xml文件申明//param:xmlPath:xml文件路径;strDecl:xml申明//return:boolbool getXMLDeclaration(const char* xmlPath,string& strDecl){    XMLDocument doc;    if(doc.LoadFile(xmlPath)!=0)    {        cout<<"load xml file failed"<<endl;        return false;    }    XMLNode* decl=doc.FirstChild();      if (NULL!=decl)      {          XMLDeclaration* declaration =decl->ToDeclaration();          if (NULL!=declaration)          {                strDecl = declaration->Value();              return true;        }     }    return false;}验证代码:int main(int argc,char* argv[]){    //获取xml文件申明    string strDecl;    if(getXMLDeclaration("./user.xml",strDecl))    {        cout<<"declaration:"<<strDecl<<endl;    }    return 0;}验证结果:declaration:xml version="1.0" encoding="UTF-8" standalone="no"