查看原文
其他

TinyXML2 使用方法及示例

CPP开发者 2021-07-20

(给CPP开发者加星标,提升C/C++技能)

来源:凉_白开
blog.csdn.net/liang_baikai/article/details/78783839

【导读】:是我们常用的 XML 文件解析库,文本主要讲解 TinyXML2 这个优秀的 XML文件解析库,不熟悉的朋友们快来学习下吧。


以下正文


概述


TinyXML2 是简单实用的开源的 C++ XML 文件解析库,可以很方便的应用到现有的项目之中。

TinyXML2 解析器相对 TinyXML1 在代码上是完全重写,使其更适合于游戏开发中使用。它使用更少的内存,更快,并使用更少的内存分配。


说明

xml类似数据库,一般来说对数据库有什么操作,那么对xml文件也能实现什么操作。
数据库增删查改对应xml文件就是新建xml文件、增加xml文件节点,删除xml文件节点,查询xml文件指定节点的值,修改xml文件中节点的值。


使用方法

将tinyxml2.cpp和tinyxml2.h拷贝至项目目录,使用时包含

#include "tinyxml2.h"using namespace tinyxml2

创建XML文件

int createXML(const char* xmlPath){ XMLDocument doc; if(3 != doc.LoadFile(xmlPath)) { cout <<"file has been existed !"<<endl; return 0; }
//添加申明可以使用如下两行 XMLDeclaration* declaration=doc.NewDeclaration(); doc.InsertFirstChild(declaration);
XMLElement* root=doc.NewElement("XMLUSER"); doc.InsertEndChild(root);

XMLElement* userNode = doc.NewElement("User"); /*添加属性*/ userNode->SetAttribute("Name","liangbaikai"); userNode->SetAttribute("Password ","bbbbbb"); root->InsertEndChild(userNode);
return doc.SaveFile(xmlPath);}int main( int argc, const char ** argv ){ /*创建*/ createXML("./xml/bbb.xml"); /*增*/ //addXML1("./xml/bbb.xml");/*添加性别,号码,邮箱*/ /*再添加一个用户*/ //addXML2("./xml/bbb.xml");/*在性别后面添加年龄,再添加一个号码*/ /*删*/ //deleteXML("./xml/bbb.xml");/*删除第一个号码,删除第二个号码的属性*/ /*改*/ //changeXML("./xml/bbb.xml");/*将liangbaikai的年龄改为10000岁,将wenbaikai的号码改为8888结尾*/ /*查*/ //selectXML("./xml/bbb.xml");/*将liangbaikai的信息打印出来*/ return 0;}

生成的文件如下

<?xml version="1.0" encoding="UTF-8"?><XMLUSER> <User Name="liangbaikai" Password ="bbbbbb"/></XMLUSER>

int addXML1(const char* xmlPath){ XMLDocument doc; if(doc.LoadFile(xmlPath) != 0) { cout<<"load xml file failed"<<endl; return false; } XMLElement* root=doc.RootElement(); XMLElement* userNode=root->FirstChildElement("User");
XMLElement* gender = doc.NewElement("Gender"); XMLText* genderText=doc.NewText("man"); gender->InsertFirstChild(genderText); userNode->InsertFirstChild(gender);
XMLElement* mobile = doc.NewElement("Mobile"); mobile->InsertFirstChild(doc.NewText("188****6211")); userNode->InsertEndChild(mobile);
XMLElement* email = doc.NewElement("Email"); email->InsertFirstChild(doc.NewText("1157***657@qq.com")); userNode->InsertEndChild(email);
XMLElement* userNode1 = doc.NewElement("User"); userNode1->SetAttribute("Name","Wenbaikai"); userNode1->SetAttribute("Password ","aaaaa"); root->InsertEndChild(userNode1);
XMLElement* mobile1 = doc.NewElement("Mobile"); mobile1->InsertFirstChild(doc.NewText("166****6666")); userNode1->InsertEndChild(mobile1);
return doc.SaveFile(xmlPath);}
int addXML2(const char* xmlPath){ XMLDocument doc; if(doc.LoadFile(xmlPath) != 0) { cout<<"load xml file failed"<<endl; return false; } XMLElement* root=doc.RootElement(); XMLElement* userNode=root->FirstChildElement("User");
XMLElement*gender = userNode->FirstChildElement("Gender"); XMLElement* age = doc.NewElement("Age"); age->InsertFirstChild(doc.NewText("18")); userNode->InsertAfterChild(gender,age);
XMLElement*mobile = userNode->FirstChildElement("Mobile"); mobile->SetAttribute("Location","home"); XMLElement* mobile1 = doc.NewElement("Mobile"); mobile1->SetAttribute("Location","company"); mobile1->InsertFirstChild(doc.NewText("188****8888")); userNode->InsertAfterChild(mobile,mobile1);
return doc.SaveFile(xmlPath);}int main( int argc, const char ** argv ){ /*创建*/ createXML("./xml/bbb.xml"); /*增*/ addXML1("./xml/bbb.xml");/*添加性别,号码,邮箱*/ /*再添加一个用户*/ addXML2("./xml/bbb.xml");/*在性别后面添加年龄,再添加一个号码*/ /*删*/ //deleteXML("./xml/bbb.xml");/*删除第一个号码,删除第二个号码的属性*/ /*改*/ //changeXML("./xml/bbb.xml");/*将liangbaikai的年龄改为10000岁,将wenbaikai的号码改为8888结尾*/ /*查*/ //selectXML("./xml/bbb.xml");/*将liangbaikai的信息打印出来*/ return 0;}

效果如下

<?xml version="1.0" encoding="UTF-8"?><XMLUSER> <User Name="liangbaikai" Password="bbbbbb"> <Gender>man</Gender> <Age>18</Age> <Mobile Location="home">188****6211</Mobile> <Mobile Location="company">188****8888</Mobile> <Email>1157***657@qq.com</Email> </User> <User Name="Wenbaikai" Password="aaaaa"> <Mobile>166****6666</Mobile> </User></XMLUSER>

int deleteXML(const char* xmlPath){ XMLDocument doc; if(doc.LoadFile(xmlPath) != 0) { cout<<"load xml file failed"<<endl; return false; } XMLElement* root=doc.RootElement(); XMLElement* userNode=root->FirstChildElement("User"); XMLElement*mobile = userNode->FirstChildElement("Mobile"); userNode->DeleteChild(mobile); XMLElement*mobile1 = userNode->FirstChildElement("Mobile"); mobile1->DeleteAttribute("Location"); return doc.SaveFile(xmlPath);}int main( int argc, const char ** argv ){ /*创建*/ createXML("./xml/bbb.xml"); /*增*/ addXML1("./xml/bbb.xml");/*添加性别,号码,邮箱*/ /*再添加一个用户*/ addXML2("./xml/bbb.xml");/*在性别后面添加年龄,再添加一个号码*/ /*删*/ deleteXML("./xml/bbb.xml");/*删除第一个号码,删除第二个号码的属性*/ /*改*/ //changeXML("./xml/bbb.xml");/*将liangbaikai的年龄改为10000岁,将wenbaikai的号码改为8888结尾*/ /*查*/ //selectXML("./xml/bbb.xml");/*将liangbaikai的信息打印出来*/ return 0;}

效果如下

<?xml version="1.0" encoding="UTF-8"?><XMLUSER> <User Name="liangbaikai" Password="bbbbbb"> <Gender>man</Gender> <Age>18</Age> <Mobile>188****8888</Mobile> <Email>1157***657@qq.com</Email> </User> <User Name="Wenbaikai" Password="aaaaa"> <Mobile>166****6666</Mobile> </User></XMLUSER>

int changeXML(const char* xmlPath){ XMLDocument doc; if(doc.LoadFile(xmlPath)!=0) { cout<<"load xml file failed"<<endl; return false; } XMLElement* root=doc.RootElement(); XMLElement* userNode=root->FirstChildElement("User"); while(userNode != NULL) { if( 0 == strncmp("liangbaikai",(userNode->Attribute("Name")),11)) { userNode->FirstChildElement("Age")->SetText("10000"); userNode = userNode->NextSiblingElement(); } else if(( 0 == strncmp("Wenbaikai",(userNode->Attribute("Name")),11))) { userNode->FirstChildElement("Mobile")->SetText("166****8888"); userNode = userNode->NextSiblingElement(); } else { userNode = userNode->NextSiblingElement(); } } return doc.SaveFile(xmlPath);}int main( int argc, const char ** argv ){ /*创建*/ createXML("./xml/bbb.xml"); /*增*/ addXML1("./xml/bbb.xml");/*添加性别,号码,邮箱*/ /*再添加一个用户*/ addXML2("./xml/bbb.xml");/*在性别后面添加年龄,再添加一个号码*/ /*删*/ deleteXML("./xml/bbb.xml");/*删除第一个号码,删除第二个号码的属性*/ /*改*/ changeXML("./xml/bbb.xml");/*将liangbaikai的年龄改为10000岁,将wenbaikai的号码改为8888结尾*/ /*查*/ //selectXML("./xml/bbb.xml");/*将liangbaikai的信息打印出来*/ return 0;}

效果如下

<?xml version="1.0" encoding="UTF-8"?><XMLUSER> <User Name="liangbaikai" Password="bbbbbb"> <Gender>man</Gender> <Age>10000</Age> <Mobile>188****8888</Mobile> <Email>1157***657@qq.com</Email> </User> <User Name="Wenbaikai" Password="aaaaa"> <Mobile>166****8888</Mobile> </User></XMLUSER>

int selectXML(const char* xmlPath){ XMLDocument doc; if(doc.LoadFile(xmlPath)!=0) { cout<<"load xml file failed"<<endl; return false; } XMLElement* root=doc.RootElement(); XMLElement* userNode=root->FirstChildElement("User"); while(userNode != NULL) { if( 0 == strncmp("liangbaikai",(userNode->Attribute("Name")),11)) { cout << userNode->Attribute("Name") << endl; cout << userNode->Attribute("Password") << endl; cout << userNode->FirstChildElement("Age")->GetText() << endl; cout << userNode->FirstChildElement("Gender")->GetText() << endl; cout << userNode->FirstChildElement("Mobile")->GetText() << endl; cout << userNode->FirstChildElement("Email")->GetText() << endl; userNode = userNode->NextSiblingElement(); } else { userNode = userNode->NextSiblingElement(); } } return 0;}
int main( int argc, const char ** argv ){ /*创建*/ createXML("./xml/bbb.xml"); /*增*/ addXML1("./xml/bbb.xml");/*添加性别,号码,邮箱*/ /*再添加一个用户*/ addXML2("./xml/bbb.xml");/*在性别后面添加年龄,再添加一个号码*/ /*删*/ deleteXML("./xml/bbb.xml");/*删除第一个号码,删除第二个号码的属性*/ /*改*/ changeXML("./xml/bbb.xml");/*将liangbaikai的年龄改为10000岁,将wenbaikai的号码改为8888结尾*/ /*查*/ selectXML("./xml/bbb.xml");/*将liangbaikai的信息打印出来*/ return 0;}

效果如下

liangbaikaibbbbbb10000man188****88881157***657@qq.com


- EOF -


推荐阅读  点击标题可跳转

1、C++20 标准正式发布

2、C++ cin 的详细用法

3、C 语言中的交互式编程


关于TinyXML2使用方法,欢迎在评论中和我探讨。觉得文章不错,请点赞和在看支持我继续分享好文。谢谢!


关注『CPP开发者』

看精选C++技术文章 . 加C++开发者专属圈子

↓↓↓


点赞和在看就是最大的支持❤️

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存