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;elsecout<<"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;elsecout<<"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"

tinyxml2库的使用相关推荐

  1. 使用tinyxml2库解析xml

    tinyxml2简介 tinyxml2是c++编写的轻量级的xml解析器,而且是开放源代码的,在一些开源的游戏引擎中用的比较多.源码托管在github上. 源码地址:https://github.co ...

  2. xml开发笔记(一):tinyXml2库介绍、编译和工程模板

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/111828450 长期持续带来更多项目与技术分 ...

  3. vba xml 怎么设置父节点_熊二做了一个xml报文处理的开源库easyxml

    ❝ 自信.冷静.专注.-- TM 熊的自我勉励 ❞ 1. 前言 熊二从去年开始,因项目需求接触到xml报文的处理,也是我第一次学习用C/C++的方式处理基于DOM模型的xml报文.因为本人比较懒hhh ...

  4. tinyxml2使用

    文章目录 1.概述 2.构造数据并创建xml文件 3.解析xml文件并读取数据 4.其他一些操作 5.总结 1.概述 tinyxml2 github地址 本文涵盖了日常编码中会使用tinyxml2库进 ...

  5. tinyxml2的使用说明

    tinyxml2的使用说明 参考了这篇博客 tinyxml2安装 推荐使用vcpkg进行安装,关于vcpkg如何安装? 参考 https://docs.microsoft.com/zh-cn/cpp/ ...

  6. tinyxml2的安装使用及示例总结

    TinyXml2 库使用方法 安装 下载地址  https://github.com/leethomason/tinyxml2 使用 git 下载 (1)下载 tinyxml2 git clone h ...

  7. 一款C++ 可视化调试工具增强插件

    一款使C++的可视化调试工具支持Boost, wxWidgets, TinyXML, TinyXML2库的插件,如果你用到了这些库,这个就是一个不可多得的好工具. 下载地址:C++ Debugger ...

  8. 企业微信加密消息体_微信企业号开发之加密方案与全局返回码说明

    本文包含了企业号回调企业时加解密的详细方案.库和示例代码的下载,以及企业号api接口返回的错误码. 一.关于加解密方案的详细说明 1.术语及说明 开启回调模式时,有以下术语需要了解: 1)msg_si ...

  9. (C++)将数据库文件导出XML文件以及解析XML文件生成数据库文件的处理方法

    将数据库文件导出XML文件以及解析XML文件生成数据库文件的处理方法 思路:将数据库所有要导出的信息通过sql语句得到,存储到结构体中,然后将结构体的内容通过自定义的xml格式导出. 此方法使用的是T ...

最新文章

  1. spring AOP编程
  2. 什么是Windows Service应用程序?(转)
  3. JavaScript实现floatAsBinaryString浮点转为二进制字符串算法(附完整源码)
  4. php fpm 不写errorlog,PHP-FPM不写入错误日志
  5. python自带的idle输入python_打开python自带IDLE出的问题
  6. 51单片机汇编_1_内外存储器转移数据
  7. python 自动执行 apdl_在高效的mann中从Python运行ANSYS Mechanical APDL
  8. 除了深度学习,机器翻译还需要啥?
  9. 图片在手机上怎么修改格式?怎么改变图片格式?
  10. NOIP2018赛前停课集训记(10.24~11.08)
  11. 2020-09-07关皓
  12. ubuntu下查看显卡型号
  13. Android 10 默认输入法
  14. 行式 Excel 文件拆分
  15. libvpx将yuv转vp8/vp9(八)
  16. MIT 18.02 多变量微积分总结(Part I)
  17. unity可以用中文了?代码也可以中文?
  18. CKEditor 4使用方法,来自http://docs.ckeditor.com/#!/guide/dev_ckeditor_js_load官网地址
  19. 计算机网络安全-----身份认证
  20. CSDN:博客如何去广告

热门文章

  1. Sencha Themer
  2. 【历史上的今天】8 月 18 日:硅谷神话的衰落;微软发布 QuickBASIC;Adobe Audition 问世
  3. 好斗or炒作?甲骨文“撕咬”过的那些对手 - 爱上英语题库系统|郭雄飞
  4. Should be compatible with WP_Widget::widget($args, $instance)
  5. 近期尝试UR5和PhantomOmni的联动仿真出现的问题
  6. 安装kali Linux到U盘
  7. Unity3D学习——UGUI对话气泡实现
  8. 曾推出Anki Drive和Cozmo人工智能机器人的独角兽企业Anki谢幕
  9. 麒麟座V3.1接入OneNET平台初体验--上传温湿度
  10. CodeForces 283C Coin Troubles 分析+背包思想