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"
阅读全文
0 0
- tinyxml2库的使用
- cocos2dx TinyXml2的使用
- tinyxml2的使用
- 使用C++ tinyxml2库
- 使用tinyxml2库解析xml
- 使用Tinyxml2进行简单的xml操作
- tinyxml2简单使用
- TinyXML2使用教程
- C++中使用TinyXML2
- TinyXML2开源库使用
- 使用tinyXML2 读写配置文件
- Android使用TinyXml2读取文件出错的解决办法
- cocos中使用tinyxml2遇到的一个小问题
- tinyxml2的简单运用
- TinyXML2
- 基于tinyXml2库封装的解析xml的通用类
- 基于tinyXml2库封装的解析xml的通用类
- C++使用TinyXml2解析Xml
- 搭建SSM框架所遇到的问题记录
- 2017年——10年JAVA大神告诉你最常用的20%技术有哪些?
- java中传递参数的两种方式
- 【poj3617】Best Cow Line 贪心
- 99%的数据工作者都不曾知道的一款利器
- tinyxml2库的使用
- NOIP模拟(20171102)T1 活动安排
- Ubuntu 安装mysql和简单操作
- MySQL学习(三)【MySQL事务与存储引擎】
- 2017年BAT,京东,美团,滴滴等公司面试经验总结
- 'use strict'-->校验js
- swift版webview加载网页(带进度条)
- 引用博客:http://blog.csdn.net/u012230055/article/details/64125268
- less学习(五)—关于Mixin