使用TinyXML-2解析XML文件
一、XML介绍
当我们想要在不同的程序、系统或平台之间共享信息时,就需要一种统一的方式来组织和表示数据。XML(EXtensible Markup Language,即可扩展标记语言)是一种用于描述数据的标记语言,它让数据以一种结构化的方式呈现,使得计算机程序能够轻松理解和处理这些数据。
XML有以下特点:
- 可扩展性:XML 标记集合不是固定的,可以根据需要进行扩展。它允许用户自定义标记,因此可以根据需要创建自定义的数据结构和标记集合,使其适应各种不同的应用场景。
- 自我描述性:XML 文档包含标签(元素)和属性,这些标签和属性的名称通常反映了其所包含数据的含义。因此,XML 文档本身提供了关于数据结构和含义的信息。
- 结构化:XML 使用标记来标识数据,并通过元素之间的嵌套关系来表示数据的结构,使其更易于理解和处理。
- 跨平台性:XML是一种独立于平台和编程语言的标记语言,可以在各种不同的操作系统和软件环境中使用,并且能够轻松地与网络上的其他系统进行数据交换。
- 数据分离:XML将数据与其格式和结构分离开来,使得数据和显示方式之间有了清晰的分界,这有助于更灵活地管理和维护数据。
- 通用性:XML 广泛应用于各种领域,例如数据交换、配置文件、Web服务等,因其通用性而受到广泛支持和应用。
二、XML的解析
常见的XML解析方式有以下几种:
- DOM 解析:DOM(Document Object Model,文档对象模型)解析器会将整个 XML 文档加载到内存中,并将其表示为一个树形结构,开发者可以通过遍历树节点来访问和操作 XML 元素和属性。
- SAX 解析:SAX(Simple API for XML)解析器是一种基于事件驱动的解析方式,它顺序读取 XML 文档,当遇到 XML 元素、文本或其他事件时,会触发相应的回调函数,开发者可以在回调函数中处理这些事件。
- XPath:XPath 是一种用于在 XML 文档中定位节点的语言,可以通过路径表达式来指定节点的位置和关系,从而实现对 XML 数据的精确访问和提取。
- XSLT:可扩展样式表语言转换(EXtensible Stylesheet Language Transformations)是一种基于 XML 的语言,用于对 XML 数据进行转换和处理。可以将XML数据档转换为另外的XML或其它格式,如HTML网页,纯文字等。
- 第三方库和工具:除了语言内置的解析库外,还有许多第三方库和工具可用于解析 XML 文件,如 lxml(Python)、Jsoup(Java)、XmlReader(C#)等。
三、TinyXML-2简介
TinyXML-2 是一个简单、小型、高效的 C++ XML 解析器,可被轻易地集成到其他程序中。它使用文档对象模型(DOM)的方式解析XML,可使用它解析 XML 文档,并读取、修改和保存的文档对象模型。
使用TinyXML-2可以实现对XML文件的:创建、解析、修改等功能。
该项目的GitHub链接如下:
TinyXML-2 【github项目】
也可以从此处下载TinyXML2源码(免费,不需要积分):
【免费】XML解析工具-TinyXML2-源代码-C++资源-CSDN文库
四、XML解析示例
4.1 创建测试用的XML文件
创建testXML.xml,内容如下所示:
<?xml version="1.0" encoding="utf-8"?>
<!--for test-->
<system><android><NULL>null</NULL></android><windows><windows7><apps><app>windows7 c</app><app>windows7 c++</app><app>windows7 java</app><app>windows7 python</app></apps></windows7><windows10><apps><app>windows10 c</app><app>windows10 c++</app><app>windows10 java</app><app>windows10 python</app></apps></windows10><windows11><apps><app>windows11 c</app><app>windows11 c++</app><app>windows11 java</app><app>windows11 python</app></apps></windows11></windows><linux><ubuntu><apps><app>ubuntu_c</app><app>ubuntu_c++</app><app>ubuntu_java</app><app>ubuntu_python</app></apps></ubuntu><centos><apps><app>centos_c</app><app>centos_c++</app><app>centos_java</app><app>centos_python</app></apps></centos></linux>
</system>
注:
- 根元素为 system ,其中包含 android、windows、linux三个操作系统大类。
- 每个操作系统大类下又包含具体的操作系统版本,如windows包含windows7、windows10、windows11等。
- 对每一个具体的操作系统版本,包含了用以存储若干app的 apps 。
- 每个应用存储到具体的某个app中。
4.2 拷贝TinyXML-2项目的代码
将TinyXML-2项目中的 tinyxml2.cpp、tinyxml2.h 两个文件拷贝到当前的工作目录。
4.3 编写XML解析的测试代码
本次以 读取并输出 “某类操作系统” 中的 “各个具体操作系统版本” 的 “app内容” 为例:
创建readxml.cpp并编辑,该文件内容如下:
#include <iostream>
#include <vector>
#include "tinyxml2.h"using namespace tinyxml2;
using namespace std;//定义结构体OS_APPS以进行数据存储
typedef struct os_apps{string osname;vector<string> apps;
} OS_APPS;//输出容器中的所有信息
void show(vector<OS_APPS> &v)
{cout<<"\n----------print----------" << endl;for(OS_APPS oa : v){cout << "osname: " << oa.osname << endl;int cnt = 1;for(auto app : oa.apps){cout << "app" << cnt << ": " << app << endl;cnt ++;}cout << endl;}
}//从XMLDocument中读取指定的操作系统大类,并存储到容器中
void read_xml(XMLDocument* doc, vector<OS_APPS> &v, const char* target_os)
{// 获取根元素XMLElement* root = doc->RootElement(); if (!root) {std::cout << "No root element found!" << std::endl;exit(1);}// 查找指定OS类别XMLElement* os_element = root->FirstChildElement(target_os);if (!os_element) {// 未找到指定元素cout << "os_element not found!" << endl;exit(1);}// 遍历所有指定分类下的所有子OSXMLElement* sub_os_element = os_element -> FirstChildElement();if(!sub_os_element){cout << "can't get sub_os_element!" << endl;exit(1);}while(sub_os_element){OS_APPS oa;vector<string> s;//获取子操作系统的名称oa.osname = sub_os_element -> Value();//获取存储apps列表的节点XMLElement* apps_element = sub_os_element -> FirstChildElement();if(!apps_element){cout << "can't read " << oa.osname << "'apps, please check XML file!" << endl;exit(1);}else{cout << "begin to read " << oa.osname << "'s apps" << endl;}//获取每一个app元素,并继续读取其他同级app内容XMLElement* app_element = apps_element -> FirstChildElement();while(app_element){s.push_back(app_element -> GetText());app_element = app_element -> NextSiblingElement();}//存储oa.apps = s;v.push_back(oa);//继续处理同级的其他子OSsub_os_element = sub_os_element -> NextSiblingElement();}}int main( int argc, const char ** argv)
{//读取的数据将存放在容器v中vector<OS_APPS> v;//参数校验if(argc == 1){cout << "please input the XML filename!" << endl;exit(0);}//打开文件XMLDocument* doc = new XMLDocument();doc->LoadFile( argv[1] );if (doc->ErrorID() != XML_SUCCESS) {cout << "Error loading XML file!" << endl;return 1;}printf( "XML file '%s' is loaded.\n", argv[1]);//读取指定类别信息,并存储到容器v中read_xml(doc, v, "windows");//输出读取的信息show(v);return 0;
}
4.4 生成可执行程序
在命令行执行以下命令:
g++ -g -c tinyxml2.cpp -o tinyxml2.o
g++ -g -c readxml.cpp -o readxml.og++ -g -o read_xml_test tinyxml2.o readxml.o
4.5 执行程序
执行程序:
./read_xml_test testXML.xml
执行结果如下所示:

可以看到,XML中的文件已经被成功读取。
五、示例代码下载
这里是以上测试代码文件(为了方便测试,补充了makefile文件和shell脚本)。
run_test.sh shell文件,清理当前目录,重新执行make命令,并运行代码
Makefile makefile文件,编译并链接项目
readxml.cpp XML解析测试源文件
tinyxml2.cpp TinyXML-2 源文件
tinyxml2.h TinyXML-2头文件testXML.xml 测试用xml文件
执行结果如下:

下载链接:
【免费】XML解析示例项目-读取并输出xml的指定内容示例资源-CSDN文库
六、函数的参数及功能
在tinyxml2.h 中,给出了函数的定义,功能及参数类型,可根据需求寻找与使用相应的函数。

如有不当或错误之处,恳请您的指正,谢谢!!!
相关文章:
使用TinyXML-2解析XML文件
一、XML介绍 当我们想要在不同的程序、系统或平台之间共享信息时,就需要一种统一的方式来组织和表示数据。XML(EXtensible Markup Language,即可扩展标记语言)是一种用于描述数据的标记语言,它让数据以一种结构化的方…...
Linux:docker在线仓库(docker hub 阿里云)基础操作
把镜像放到公网仓库,这样可以方便大家一起使用,当需要时直接在网上拉取镜像,并且你可以随时管理自己的镜像——删除添加或者修改。 1.docker hub仓库 2.阿里云加速 3.阿里云仓库 由于docker hub是国外的网站,国内的对数据的把控…...
C语言程序设计(第四版)—习题7程序设计题
目录 1.选择法排序。 2.求一批整数中出现最多的数字。 3.判断上三角矩阵。 4.求矩阵各行元素之和。 5.求鞍点。 6.统计大写辅音字母。 7.字符串替换。 8.字符串转换成十进制整数。 1.选择法排序。 输入一个正整数n(1<n≤10)…...
ZCC6982-同步升压充双节锂电池充电芯片
特性 ■高达 2A 的可调充电电流(受实际散热和输入功率限制) ■支持 8.4V、8.6V、8.7V、8.8V 的充满电压(限QFN) ■高达 28V 的输入耐压保护 ■高达 28V 的电池端耐压保护 ■宽输入工作电压范围:3.0V~6.5V ■峰值…...
定时器(基本定时器、通用定时器、高级定时器)
目录 一、基本定时器 二、通用定时器 三、高级定时器 一、基本定时器 1、作用:计时和计数。 二、通用定时器 1、除了有基本定时器的计时和计数功能外,主要有输入捕获和输出比较的功能,硬件主要由六大部分组成: ① 时钟源 ② 控…...
009集——磁盘详解——电脑数据如何存储在磁盘
很多人也知道数据能够保存是由于设备中有一个叫做「硬盘」的组件存在,但也有很多人不知道硬盘是怎样储存这些数据的。这里给大家讲讲其中的原理。 首先我们要明白的是,计算机中只有0和1,那么我们存入硬盘的数据,实际上也就是一堆0…...
鸿蒙开发-HarmonyOS UI架构
初步布局Index 当我们新建一个工程之后,首先会进入Index页。我们先简单的做一个文章列表的显示 class Article {title?: stringdesc?: stringlink?: string }Entry Component struct Index {State articles: Article[] []build() {Row() {Scroll() {Column() …...
Flutter 动画(显式动画、隐式动画、Hero动画、页面转场动画、交错动画)
前言 当前案例 Flutter SDK版本:3.13.2 显式动画 Tween({this.begin,this.end}) 两个构造参数,分别是 开始值 和 结束值,根据这两个值,提供了控制动画的方法,以下是常用的; controller.forward() : 向前…...
用HTML5 Canvas创造视觉盛宴——动态彩色线条效果
目录 一、程序代码 二、代码原理 三、运行效果 一、程序代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!-- 声明文档类型为XHTML 1.0 Transitional -…...
云原生介绍与容器的基本概念
云原生介绍 1、云原生的定义 云原生为用户指定了一条低心智负担的、敏捷的、能够以可扩展、可复制的方式最大化地利用云的能力、发挥云的价值的最佳路径。 2、云原生思想两个理论 第一个理论基础是:不可变基础设施。 第二个理论基础是:云应用编排理…...
Flash存储
目录 一、MCU读写擦除Flash步骤 1、写flash步骤: 2、读flash步骤: 3、擦除flash步骤: 4、要注意的地方: 一、MCU读写擦除Flash步骤 1、写flash步骤: (1)解锁 2、读flash步骤: 3、擦除flash步骤&#x…...
Day 44 | 动态规划 完全背包、518. 零钱兑换 II 、 377. 组合总和 Ⅳ
完全背包 题目 文章讲解 视频讲解 完全背包和0-1背包的区别在于:物品是否可以重复使用 思路:对于完全背包问题,内层循环的遍历方式应该是从weight[i]开始一直遍历到V,而不是从V到weight[i]。这样可以确保每种物品可以被选择多次…...
使用PaddleNLP UIE模型提取上市公司PDF公告关键信息
项目地址:使用PaddleNLP UIE模型抽取PDF版上市公司公告 - 飞桨AI Studio星河社区 (baidu.com) 背景介绍 本项目将演示如何通过PDFPlumber库和PaddleNLP UIE模型,抽取公告中的相关信息。本次任务的PDF内容是破产清算的相关公告,目标是获取受理…...
软件工程师,OpenAI Sora驾到,快来围观
概述 近期,OpenAI在其官方网站上公布了Sora文生视频模型的详细信息,展示了其令人印象深刻的能力,包括根据文本输入快速生成长达一分钟的高清视频。Sora的强大之处在于其能够根据文本描述,生成长达60秒的视频,其中包含&…...
【Linux 04】编辑器 vim 详细介绍
文章目录 🌈 Ⅰ 基本概念🌈 Ⅱ 基本操作1. 进入 / 退出 vim2. vim 模式切换 🌈 Ⅲ 命令模式1. 光标的移动2. 复制与粘贴3. 剪切与删除4. 撤销与恢复 🌈 Ⅳ 底行模式1. 保存文件2. 查找字符3. 退出文件4. 替换内容5. 显示行号6. 外…...
KMP算法详解
1. 问题引入 链接:leetcode_28 题目:s1字符串是否包含s2字符串,如果包含返回s1中包含s2的最左开头位置,不包含返回-1 暴力方法就是s1的每个位置都做开头,然后去匹配s2整体,时间复杂度O(n*m) KMP算法可以…...
ubuntu22.04@laptop OpenCV Get Started: 013_contour_detection
ubuntu22.04laptop OpenCV Get Started: 013_contour_detection 1. 源由2. 应用Demo2.1 C应用Demo2.2 Python应用Demo 3. contour_approx应用3.1 读取图像并将其转换为灰度格式3.2 应用二进制阈值过滤算法3.3 查找对象轮廓3.4 绘制对象轮廓3.5 效果3.6 CHAIN_APPROX_SIMPLE v.s…...
[ai笔记5] 个人AI资讯助手实战
欢迎来到文思源想的ai空间,这是技术老兵重学ai以及成长思考的第5篇分享,也是把ai场景化应用的第一篇实操内容! 既然要充分学习和了解ai,自然少不了要时常看看ai相关资讯,所以今天特地用字节的“扣子”做了一个ai的资讯…...
QT+OSG/osgEarth编译之八十九:osgdb_ply+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_ply)
文章目录 一、osgdb_ply介绍二、文件分析三、pro文件四、编译实践一、osgdb_ply介绍 斯坦福三角形格式(Stanford Triangle Format)是一种用于存储三维模型数据的文件格式,也称为 PLY 格式。它最初由斯坦福大学图形实验室开发,用于存储和共享三维扫描和计算机图形数据。 P…...
机器人专题:我国机器人产业园区发展现状、问题、经验及建议
今天分享的是机器人系列深度研究报告:《机器人专题:我国机器人产业园区发展现状、问题、经验及建议》。 (报告出品方:赛迪研究院) 报告共计:26页 机器人作为推动工业化发展和数字中国建设的重要工具&…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
