C++中使用TinyXML2读写文件

  • XML基本概念参考:https://blog.csdn.net/baidu_41388533/article/details/108004122
  • 参考:https://www.cnblogs.com/xbit/p/9046094.html
  • 下载源代码
    • 开源代码github地址: https://github.com/leethomason/tinyxml2
  • 添加工程文件
    • 将源代码目录中 tinyxml2.h 和 tinyxml2.cpp 文件拷贝到工程目录下,并加入到工程中。
  • 参考:《C++ XML 库 TinyXML2 的基本使用》
  • 参考:《tinyxml2读写XML文件的例程》
  • 参考:《C++调用tinyxml2读写xml》
    • 创建XML文件后,进行文档声明,之后创建根节点,然后创建子节点,给子节点添加属性,内容,最后按顺序挂载到根节点上。多级可依次类推。
    • 加载文件后,通过RootElement()找到根节点,通过根节点->FirstChildElement(标签),获取节点,再通过节点->GetText()获取内容。
    • 如果要遍历整个文档,可从 XMLDocument 开始遍历,XXXChild + XXXSibling 遍历所有的子节点和兄弟节点。
#include <iostream>
#include"tinyxml2.h"using namespace std;
//using namespace tinyxml2;void createXml()
{//声明要创建的xml文件tinyxml2::XMLDocument xml;tinyxml2::XMLDeclaration* declaration = xml.NewDeclaration();xml.InsertFirstChild(declaration);//创建根节点tinyxml2::XMLElement* rootNode = xml.NewElement("computer");xml.InsertEndChild(rootNode);//创建子节点tinyxml2::XMLElement* root_1_NodeComputerMonitor = xml.NewElement("ComputerMonitor");tinyxml2::XMLElement* root_1_NodeKeyboard = xml.NewElement("Keyboard");tinyxml2::XMLElement* root_1_CPU = xml.NewElement("CPU");//给子节点增加内容tinyxml2::XMLText* text_root_1_NodeComputerMonitor = xml.NewText("SAMSUNG");root_1_NodeComputerMonitor->InsertFirstChild(text_root_1_NodeComputerMonitor);tinyxml2::XMLText* text_root_1_root_1_CPU = xml.NewText("intel");root_1_CPU->InsertFirstChild(text_root_1_root_1_CPU);//给子节点增加属性root_1_NodeComputerMonitor->SetAttribute("size", "15");root_1_CPU->SetAttribute("series", "XEON");//创建子节点的子节点tinyxml2::XMLElement* root_2_NodeKeyboardAttribute = xml.NewElement("KeyboardAttribute");//给子节点的子节点增加内容tinyxml2::XMLText* text_root_2_NodeKeyboardAttribute = xml.NewText("cherry Mechanical Keyboard");root_2_NodeKeyboardAttribute->InsertFirstChild(text_root_2_NodeKeyboardAttribute);//构建xml树,根节点的下的子节点树rootNode->InsertEndChild(root_1_NodeComputerMonitor);//childNodeStu是root的子节点rootNode->InsertEndChild(root_1_NodeKeyboard);rootNode->InsertEndChild(root_1_CPU);//构建xml树,根节点的下的子节点的子节点树root_1_NodeKeyboard->InsertEndChild(root_2_NodeKeyboardAttribute);//将xml保存到当前项目中xml.SaveFile("computer.xml");
}void deCodeXml()
{//声明tinyxml2::XMLDocument xml;//导入xml文件if (xml.LoadFile("computer.xml") != tinyxml2::XML_SUCCESS){return;}//找到导入的xml的根节点tinyxml2::XMLElement* rootNode = xml.RootElement();if (rootNode == NULL) {return;}//读取第一层子节点信息并且打印在控制台上tinyxml2::XMLElement* root_1_NodeComputerMonitor = rootNode->FirstChildElement("ComputerMonitor");std::string text_root_1_NodeComputerMonitor = root_1_NodeComputerMonitor->GetText();cout << "text_root_1_NodeComputerMonitor = " << text_root_1_NodeComputerMonitor.c_str() << endl;//读取第二层子节点信息并且打印在控制台上tinyxml2::XMLElement* root_1_NodeKeyboard = rootNode->FirstChildElement("Keyboard");tinyxml2::XMLElement* root_2_NodeKeyboardAttribute = root_1_NodeKeyboard->FirstChildElement("KeyboardAttribute");std::string text_root_2_NodeKeyboardAttribute = root_2_NodeKeyboardAttribute->GetText();cout << "text_root_2_NodeKeyboardAttribute = " << text_root_2_NodeKeyboardAttribute.c_str() << endl;
}
int main()
{cout << "----------------------begin create xml-----------------------" << endl;createXml();cout << "----------------------finished create xml--------------------" << endl;cout << "-----------------------begin read xml------------------------" << endl;deCodeXml();cout << "-----------------------finished read xml---------------------" << endl;return 0;
}
  • 输出:
<?xml version="1.0" encoding="UTF-8"?>
<computer><ComputerMonitor size="15">SAMSUNG</ComputerMonitor><Keyboard><KeyboardAttribute>cherry Mechanical Keyboard</KeyboardAttribute></Keyboard><CPU series="XEON">intel</CPU>
</computer>
  • 参考:《C++调用tinyxml2遍历xml所有节点且使用map输出的简单例子》
  • 参考:《在C++中使用TinyXML2解析xml》
  • 参考:《C++中GB2312字符串和UTF-8之间的转换》
  • 【注:】表格与XML对应关系(参考高淇老师讲解):

  • 参考:《在C++中使用TinyXML2解析xml》
  • 自己写的测试案例:
#include <iostream>
#include <string>
#include"tinyxml2.h"
#include <map>#define STUDENT_XML_CONFIG   "StudentsInfo.xml"using namespace std;
//using namespace tinyxml2;void createXml()
{//声明要创建的xml文件tinyxml2::XMLDocument xml;tinyxml2::XMLDeclaration* declaration = xml.NewDeclaration();xml.InsertFirstChild(declaration);//创建根节点tinyxml2::XMLElement* rootNode = xml.NewElement("Students_Infomation");xml.InsertEndChild(rootNode);int stuNum = 10;//总共有多少条信息tinyxml2::XMLElement* stuNumNode = xml.NewElement("Student_Number");std::string strNum = std::to_string(stuNum);tinyxml2::XMLText* stuNumValue = xml.NewText(strNum.c_str());stuNumNode->InsertFirstChild(stuNumValue);rootNode->InsertEndChild(stuNumNode);//学生总信息tinyxml2::XMLElement* stuTotalInfoNode = xml.NewElement("Student_All_Infomation");rootNode->InsertEndChild(stuTotalInfoNode);for (int i = 0; i < stuNum; ++i){//一条完整学生信息tinyxml2::XMLElement* infoRow = xml.NewElement("Student");char szID[64] = { 0 };sprintf(szID, "ID--%d", i);infoRow->SetAttribute("ID_Code", szID);//子节点信息:姓名tinyxml2::XMLElement* stuName = xml.NewElement("Name");std::string strName = "ABC--" + std::to_string(i);tinyxml2::XMLText* stuNameValue = xml.NewText(strName.c_str());stuName->InsertFirstChild(stuNameValue);infoRow->InsertEndChild(stuName);//子节点信息:年龄tinyxml2::XMLElement* stuAge = xml.NewElement("Age");std::string strAge = std::to_string(i + 10);tinyxml2::XMLText* stuAgeValue = xml.NewText(strAge.c_str());stuAge->InsertFirstChild(stuAgeValue);infoRow->InsertEndChild(stuAge);//性别tinyxml2::XMLElement* stuGender = xml.NewElement("Gender");std::string strGender = i % 2 ? "female" : "male";tinyxml2::XMLText* stuGenderValue = xml.NewText(strGender.c_str());stuGender->InsertFirstChild(stuGenderValue);infoRow->InsertEndChild(stuGender);stuTotalInfoNode->InsertEndChild(infoRow);}//将xml保存到当前项目中xml.SaveFile(STUDENT_XML_CONFIG);
}void deCodeXml()
{//声明tinyxml2::XMLDocument xml;//导入xml文件if (xml.LoadFile(STUDENT_XML_CONFIG) != tinyxml2::XML_SUCCESS){return;}//找到导入的xml的根节点tinyxml2::XMLElement* rootNode = xml.RootElement();if (rootNode == NULL) {return;}//获取总数tinyxml2::XMLElement* stuNumNode = rootNode->FirstChildElement("Student_Number");std::string strNum = stuNumNode->GetText();int iNum = atoi(strNum.c_str());cout << "Student Number = " << iNum << endl;//总信息根节点tinyxml2::XMLElement* totalInfoNode = rootNode->FirstChildElement("Student_All_Infomation");tinyxml2::XMLElement* studentNode = totalInfoNode->FirstChildElement("Student");//获取所有信息while (studentNode){//获取属性const tinyxml2::XMLAttribute* attr = studentNode->FindAttribute("ID_Code");//获取子节点,输出信息tinyxml2::XMLElement* stuNameNode = studentNode->FirstChildElement("Name");tinyxml2::XMLElement* stuAgeNode = studentNode->FirstChildElement("Age");tinyxml2::XMLElement* stuGenderNode = studentNode->FirstChildElement("Gender");if (attr){std::cout << "学生编号:" << ":" << attr->Value() \<< "  姓名:" << stuNameNode->GetText() \<< "  年龄:" << stuAgeNode->GetText() \<< "  性别:" << stuGenderNode->GetText()\<< std::endl;}//下一节点studentNode = studentNode->NextSiblingElement();}
}int main()
{cout << "----------------------begin create xml-----------------------" << endl;createXml();cout << "----------------------finished create xml--------------------" << endl;cout << "-----------------------begin read xml------------------------" << endl;deCodeXml();cout << "-----------------------finished read xml---------------------" << endl;return 0;
}
  • StudentsInfo.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<Students_Infomation><Student_Number>10</Student_Number><Student_All_Infomation><Student ID_Code="ID--0"><Name>ABC--0</Name><Age>10</Age><Gender>male</Gender></Student><Student ID_Code="ID--1"><Name>ABC--1</Name><Age>11</Age><Gender>female</Gender></Student><Student ID_Code="ID--2"><Name>ABC--2</Name><Age>12</Age><Gender>male</Gender></Student><Student ID_Code="ID--3"><Name>ABC--3</Name><Age>13</Age><Gender>female</Gender></Student><Student ID_Code="ID--4"><Name>ABC--4</Name><Age>14</Age><Gender>male</Gender></Student><Student ID_Code="ID--5"><Name>ABC--5</Name><Age>15</Age><Gender>female</Gender></Student><Student ID_Code="ID--6"><Name>ABC--6</Name><Age>16</Age><Gender>male</Gender></Student><Student ID_Code="ID--7"><Name>ABC--7</Name><Age>17</Age><Gender>female</Gender></Student><Student ID_Code="ID--8"><Name>ABC--8</Name><Age>18</Age><Gender>male</Gender></Student><Student ID_Code="ID--9"><Name>ABC--9</Name><Age>19</Age><Gender>female</Gender></Student></Student_All_Infomation>
</Students_Infomation>
  • 解析结果:

C++中使用TinyXML2读写文件相关推荐

  1. java关于资源的描述错误的是_在Java中,下列关于读写文件的描述错误的是

    摘要: 新方主要的创法是,下列指2技术纪6今的现代阶段是代至0年创新方法发展0世.读写的描本环过程节是的基思维.制让觉控当视动觉位于时控制,文件误技能动作处于说明.... 新方主要的创法是,下列指2技 ...

  2. python中csv模块读写文件

    一.csv模块读文件 1. csv.reader–可迭代对象 通过索引获取文档内容 def csv_read():file = open('./txt/names.csv','r')reader = ...

  3. python中的rt_Python 读写文件中w与wt, r与rt的区别

    w和wt是一们的,r和rt是一样的,t是默认参数,可以省略的,help(open)就能看到open的参数的详细说明. w,r,wt,rt都是python里面文件操作的模式. w是写模式,r是读模式. ...

  4. Linux内核中读写文件数据的方法

    Linux内核中读写文件数据的方法     有时候需要在Linuxkernel--大多是在需要调试的驱动程序--中读写文件数据.在kernel中操作文件没有标准库可用,需要利用kernel的一些函数, ...

  5. 【转】 Linux内核中读写文件数据的方法--不错

    原文网址:http://blog.csdn.net/tommy_wxie/article/details/8193954 Linux内核中读写文件数据的方法     有时候需要在Linuxkernel ...

  6. python读写文件详解,将数据写入一个文件或读一个文件写入另一个文件中。

    目录 实践一:读取文件并打印,read() 实践二:读取文件的一行并打印,readline() 实践三:读取文件的所有行存入到一个列表中并打印,readlines() 实践四:向文件中写入字符串,wr ...

  7. c语言格式化写入文件大小,利用C语言格式化读写文件

    "在C语言中进行格式化读写文件"按照字面意思通常大家都会理解为将读写文件进行格式化的操作,那么到底我们是不是真的将读写文件进行格式化的操作呢?下面课课家笔者就为大家简单介绍C语言中 ...

  8. c语言fseek128字节,C语言rewind和fseek函数的用法详解(随机读写文件)

    前面介绍的文件读写函数都是顺序读写,即读写文件只能从头开始,依次读写各个数据.但在实际开发中经常需要读写文件的中间部分,要解决这个问题,就得先移动文件内部的位置指针,再进行读写.这种读写方式称为随机读 ...

  9. C语言rewind函数返回值为空,C语言rewind和fseek函数的用法详解(随机读写文件)...

    前面介绍的文件读写函数都是顺序读写,即读写文件只能从头开始,依次读写各个数据.但在实际开发中经常需要读写文件的中间部分,要解决这个问题,就得先移动文件内部的位置指针,再进行读写.这种读写方式称为随机读 ...

最新文章

  1. PyTorch中的Element-wise operations
  2. 进阶学习(4.3) JVM 垃圾回收算法
  3. JS 获取字符串长度, 区别中英文
  4. Python 函数参数有冒号 声明后有- 箭头
  5. python3入门与进阶笔记_16_变量进阶 — 黑马程序员《Python入门教程完整版》笔记...
  6. VTK:可视化算法之TubesFromSplines
  7. 六西格玛dfss_向六西格玛质量水平进攻!
  8. 大数据学习笔记31:Java程序访问高可用Hadoop集群
  9. 凸优化第六章逼近与拟合 6.4鲁棒逼近
  10. SQL5 查找所有员工的last_name和first_name以及对应部门编号
  11. 国密算法使用-SM3
  12. git send-email 使用126邮件发送patch
  13. 网络质量监控 - 守好入口第一关
  14. php 中%3cspan%3e,隐藏第三方网站统计图标
  15. 解决 Windows 商店 0x800704cf 网络问题
  16. MP4学习(九)ts-mp4源码阅读(7)mdia box的解析
  17. 图形界面介绍Create Pin Blockage
  18. 如何防御黑客的社工?
  19. 基于VB的COM编程入门教程
  20. 安卓基于Frida HOOK传感器 实现虚拟运动跑步

热门文章

  1. 开源OA办公平台搭建:流程开发中常见的正则表达式
  2. 剑指offer 66道题目java实现全部代码
  3. linux cp命令 强制覆盖,解决 Linux cp 命令加了 -f 后依然提示覆盖的问题
  4. Opengl ES----glDrawArray和glDrawElements
  5. Activity面试题库
  6. 如何在linux中后台运行R
  7. Controller规范和接口定义,添加一条新数据并返回此数据的ID(主键)
  8. 《三体》地球人七宗罪
  9. MusicBox(音乐播放器)
  10. rsync服务+sersync服务