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"