tinyxml2库的使用

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:bool
bool 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:bool
bool 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:bool
bool 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"
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值