当前位置: 首页 > news >正文

XML解析库tinyxml2库使用详解

XML语法规则介绍及总结-CSDN博客        

        TinyXML-2 是一个简单轻量级的 C++ XML 解析库,它提供了一种快速、高效地解析 XML 文档的方式。

1. 下载地址

        Gitee 极速下载/tinyxml2

 2. 基本用法

下面将详细介绍 TinyXML-2 的主要使用方法:        

2.1. 引入头文件和命名空间

#include "tinyxml2.h"
using namespace tinyxml2;

2.2. 解析 XML 文档

XMLDocument doc;
doc.LoadFile("example.xml");
if (doc.ErrorID() != XML_SUCCESS) {// 处理错误return;
}

2.3. 访问根节点

XMLElement* root = doc.RootElement();

2.4. 遍历子节点

for (XMLElement* elem = root->FirstChildElement(); elem; elem = elem->NextSiblingElement()) {// 处理节点
}

2.5. 读取节点属性

const char* attr = elem->Attribute("name");
if (attr) {// 处理属性值
}

2. 6. 读取节点文本内容

const char* text = elem->GetText();
if (text) {// 处理文本内容
}

2.7. 除了遍历和读取节点,TinyXML-2 还提供了丰富的节点操作 API,包括创建、插入、删除、克隆节点等。

// 创建新节点并插入到现有节点下
XMLElement* newElem = doc.NewElement("new_element");
root->InsertEndChild(newElem);// 删除节点
root->DeleteChild(newElem);// 克隆节点
XMLElement* clonedElem = newElem->DeepClone(&doc);
root->InsertEndChild(clonedElem);

2.8. 创建新节点并添加到文档

XMLElement* newElem = doc.NewElement("new_element");
newElem->SetAttribute("attribute", "value");
newElem->SetText("New element text");
root->InsertEndChild(newElem);

2.9. 文档操作

TinyXML-2 不仅可以解析现有的 XML 文档,还可以创建新的 XML 文档,并进行保存和打印操作。

// 创建新文档
XMLDocument doc;
XMLDeclaration* decl = doc.NewDeclaration();
doc.InsertFirstChild(decl);
XMLElement* root = doc.NewElement("root");
doc.InsertEndChild(root);// 保存文档
doc.SaveFile("new_document.xml");// 打印文档
doc.Print();

 2.10. 保存 XML 文档

doc.SaveFile("new_example.xml");

2.11. 错误处理

        TinyXML-2 提供了丰富的错误处理机制。您可以通过检查 doc.ErrorID() 和 doc.ErrorName() 来获取错误编号和错误信息。

if (doc.ErrorID() != XML_SUCCESS) {printf("Error loading file: %s\n", doc.ErrorName());return;
}

2.12.内存管理

        TinyXML-2 使用自己的内存管理机制,无需手动分配和释放内存。所有的内存分配和释放都由库内部完成。

3. 代码示例

生成一个xml,用于保存照片路径,GPS信息及缺陷信息等。

#include "tinyxml2.h"
#include <string>
using namespace tinyxml2;int SaveInfo(std::string xmlFile, std::string imagePath, std::string *calssName, int calssNameNum, double lon, double lat, double alt)
{XMLDocument* doc = new XMLDocument();if(doc == NULL){   printf("New  xml is NULL!\n");return -1;}if(xmlFile.empty())    {printf("xmlFile path is NULL!\n");return -1;}// 创建xmlconst char* declaration ="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>";doc->Parse(declaration);//会覆盖xml所有内容//创建根目录XMLElement* root = doc->NewElement("Result");doc->InsertEndChild(root);//路径XMLElement* imagePathNode = doc->NewElement("imagePath");imagePathNode->InsertEndChild(doc->NewText(imagePath.c_str()));root->InsertEndChild(imagePathNode);//缺陷类别XMLElement* classTypeNode = doc->NewElement("classType");for(int i = 0; i < calssNameNum; i++){XMLElement* classNameNode = doc->NewElement("className");XMLText* classNameText=doc->NewText(calssName[i].c_str()); classNameNode->InsertEndChild(classNameText);classTypeNode->InsertEndChild(classNameNode);}root->InsertEndChild(classTypeNode);//经度XMLElement* gpsNode = doc->NewElement("gps");XMLElement* longitudeNode = doc->NewElement("longitude");XMLText* lonText=doc->NewText(std::to_string(lon).c_str()); longitudeNode->InsertEndChild(lonText);//纬度XMLElement* latitudeNode = doc->NewElement("latitude");XMLText* latText=doc->NewText(std::to_string(lat).c_str()); latitudeNode->InsertEndChild(latText);//高度XMLElement* altitudeNode = doc->NewElement("altitude");XMLText* altText=doc->NewText(std::to_string(alt).c_str());altitudeNode->InsertEndChild(altText);gpsNode->InsertEndChild(longitudeNode);gpsNode->InsertEndChild(latitudeNode);gpsNode->InsertEndChild(altitudeNode);root->InsertEndChild(gpsNode);if(XML_SUCCESS != doc->SaveFile((char *)xmlFile.c_str())){printf("ERROR: Save xml:%s fail\n", xmlFile.c_str());doc->PrintError();return -1;}printf("Save xmlFile success!\n");return 0;
}

运行结果:

4. 总结

        TinyXML-2 是一个功能强大、易用的 XML 解析库,适合各种 C++ 项目使用

相关文章:

  • Windows系统安装Docker环境详细教程
  • Armbian OS(基于ubuntu24) 源码编译mysql 5.7
  • 路径规划 | 图解遗传(GA)算法(附ROS C++仿真)
  • 传神论文中心|第11期人工智能领域论文推荐
  • RPG Maker MZ中被你忽略的干货操作——独立开关和“开关”在事件页中的关系
  • Web前端魂斗罗:深度剖析前端技术的奇幻之旅
  • flutter实现UDP发送魔法包唤醒主机
  • 碳素钢化学成分分析 螺纹钢材质鉴定 钢材维氏硬度检测
  • 【Unity回调函数】创建自己的外部回调函数——以按钮点击为例
  • 静态工厂方法替代构造器
  • 【ai】Omniverse 微服务架构及NVIDIA Omniverse™ Launcher
  • 【C语言】32个关键字
  • 软件版本号的管理
  • 【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版9(附带项目源码)
  • 自动求导实现与可视化
  • 分享的文章《人生如棋》
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 0x05 Python数据分析,Anaconda八斩刀
  • Android Studio:GIT提交项目到远程仓库
  • Effective Java 笔记(一)
  • Javascript设计模式学习之Observer(观察者)模式
  • Odoo domain写法及运用
  • opencv python Meanshift 和 Camshift
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • React as a UI Runtime(五、列表)
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 从输入URL到页面加载发生了什么
  • 关于Flux,Vuex,Redux的思考
  • 基于组件的设计工作流与界面抽象
  • 时间复杂度与空间复杂度分析
  • 学习笔记TF060:图像语音结合,看图说话
  • 由插件封装引出的一丢丢思考
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 昨天1024程序员节,我故意写了个死循环~
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (03)光刻——半导体电路的绘制
  • (1)(1.13) SiK无线电高级配置(五)
  • (SERIES10)DM逻辑备份还原
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (三) diretfbrc详解
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .net mvc 获取url中controller和action
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .Net 执行Linux下多行shell命令方法
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • .net开发时的诡异问题,button的onclick事件无效
  • .net实现客户区延伸至至非客户区
  • @Transactional 竟也能解决分布式事务?
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证