使用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 中,给出了函数的定义,功能及参数类型,可根据需求寻找与使用相应的函数。

 

 

 

如有不当或错误之处,恳请您的指正,谢谢!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/685425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaWeb:SpingBoot原理 --黑马笔记

1. 配置优先级 在我们前面的课程当中&#xff0c;我们已经讲解了SpringBoot项目当中支持的三类配置文件&#xff1a; application.properties application.yml application.yaml 在SpringBoot项目当中&#xff0c;我们要想配置一个属性&#xff0c;可以通过这三种方式当中…

OpenCV Mat实例详解 三

OpenCV Mat实例详解 一、二介绍了&#xff0c;OpenCV Mat类构造函数及其公共属性。下面继续介绍OpenCV Mat类公有静态成员函数 OpenCV Mat类公有静态成员函数&#xff08;Static Public Member Functions&#xff09; static CV_NODISCARD_STD Mat diag (const Mat &d)&…

云计算基础-存储虚拟化(深信服aSAN分布式存储)

什么是存储虚拟化 分布式存储是利用虚拟化技术 “池化”集群存储卷内通用X86服务器中的本地硬盘&#xff0c;实现服务器存储资源的统一整合、管理及调度&#xff0c;最终向上层提供NFS、ISCSI存储接口&#xff0c;供虚拟机根据自身的存储需求自由分配使用资源池中的存储空间。…

代码随想录刷题笔记-Day17

1. 路径总和 112. 路径总和https://leetcode.cn/problems/path-sum/ 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true …

循序渐进-讲解Markdown进阶(Mermaid绘图)-附使用案例

Markdown 进阶操作 查看更多学习笔记&#xff1a;GitHub&#xff1a;LoveEmiliaForever Mermaid官网 由于CSDN对某些Mermaid或Markdown语法不支持&#xff0c;因此我的某些效果展示使用图片进行 下面的笔记内容全部是我根据Mermaid官方文档学习的&#xff0c;因为是初学者所以…

记录 | windows pyqt5 pycharm配置

一、下载安装 离线安装 通过PyPI下载 https://pypi.org/ 依此搜索 python_dotenv&#xff0c;PyQt5_sip&#xff0c;PyQt5&#xff0c;pyqt5_tools&#xff0c;注意PyQt5和pyqt5_tools版本对应。 下载之后放在\Anaconda3\Lib\site-packagescmd依次 pip install *.whl 二…

人工智能学习与实训笔记(十四):Langchain Agent

0、概要 Agent是干什么的&#xff1f; Agent的核心思想是使用语言模型&#xff08;LLM&#xff09;作为推理的大脑&#xff0c;以制定解决问题的计划、借助工具实施动作。在agents中几个关键组件如下&#xff1a; Agent&#xff1a;制定计划和思考下一步需要采取的行动。Tools…

跟着pink老师前端入门教程-day27

三、变量 &#xff08;一&#xff09;变量概述 1、什么是变量 白话&#xff1a;变量就是一个装东西的盒子 通俗&#xff1a;变量是用于存放数据的容器&#xff0c;通过变量名获取数据&#xff0c;甚至数据可以修改 2、变量在内存中的存储 本质&#xff1a;变量是程序在内存…

Java毕业设计-基于ssm的网上餐厅管理系统-第72期

获取源码资料&#xff0c;请移步从戎源码网&#xff1a;从戎源码网_专业的计算机毕业设计网站 项目介绍 基于ssm的网上餐厅管理系统&#xff1a;前端jsp、jquery、bootstrap&#xff0c;后端 maven、springmvc、spring、mybatis&#xff0c;集成类名管理、菜品管理、订单管理…

(17)Hive ——MR任务的map与reduce个数由什么决定?

一、MapTask的数量由什么决定&#xff1f; MapTask的数量由以下参数决定 文件个数文件大小blocksize 一般而言&#xff0c;对于每一个输入的文件会有一个map split&#xff0c;每一个分片会开启一个map任务&#xff0c;很容易导致小文件问题&#xff08;如果不进行小文件合并&…

Sora:AI视频生产力的颠覆性跃进,让创意瞬间成“视界”!

在AI视频技术宇宙中&#xff0c;RunwayGen2、Stable Video Diffusion和Pika等明星产品早已名声在外。然而&#xff0c;今日横空出世的Sora犹如一颗璀璨新星&#xff0c;以其震撼性的创新突破&#xff0c;在视频制作领域掀起了一场革命&#xff01;相较于市面上同类AI视频神器&a…

使用 Mermaid 创建流程图,序列图,甘特图

使用 Mermaid 创建流程图和图表 Mermaid 是一个流行的 JavaScript 库&#xff0c;用于创建流程图、序列图、甘特图和其他各种图表。它的简洁语法使得创建图表变得非常简单&#xff0c;无需复杂的绘图工具或专业的编程技能。在本文中&#xff0c;我们将讲解如何使用 Mermaid 来创…

android获取sha1

1.cmd在控制台获取 切换到Android Studio\jre\bin目录下执行keytool -list -v -keystore 签名文件路径例如&#xff1a; 2.也可以在android studio中获取 在Terminal中输入命令&#xff1a;keytool -list -v -keystore 签名文件路径获取 获取到的sha1如下&#xff1a;

理解并实现OpenCV中的图像平滑技术

导读 图像模糊&#xff08;也称为图像平滑&#xff09;是计算机视觉和图像处理中的基本操作之一。模糊图像通常是噪声减少、边缘检测和特征提取等应用的第一步。在本博客中&#xff0c;我们将重点介绍如何使用Python中的OpenCV库应用多种模糊技术。 理论概述&#xff1a; 基本…

【报告解析】OpenAI Sora视频模型官方报告全解析 | 效果,能力以及基本原理

省流版 1 核心数据处理将视频数据整合成一个一个的Patch&#xff0c;方便统一训练数据&#xff0c;利用扩散Transformer架构 2 功能效果除了可以实现基础的文生视频外&#xff0c;实际上还有非常惊艳的视频延展&#xff0c;视频编辑&#xff0c;视频连接等多种功能&#xff0…

算法--数论二

这里写目录标题 高斯消元高斯消元求线性方程组用途高斯消元的数学思想例题代码 二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 高斯消元 高斯消元求线性方程组 用途 这个…

VScode写LaTeX配置,实测有效

环境配置请看LaTeX环境配置-TexLive&#xff0c;实测有效http://t.csdnimg.cn/0txlL VScode写LaTeX配置 0.smatra pdf下载 如果使用外部pdf查看器&#xff0c;比如我用的sumatra pdf,官网是Sumatra PDF reader download page 下载对应版本&#xff0c;比如64位&#xff0c;下…

Pandas:DataFrame的完整指南【第82篇—DataFrame】

Pandas&#xff1a;DataFrame的完整指南 Pandas是Python中最流行的数据处理库之一&#xff0c;而其中的DataFrame对象是数据处理的核心。DataFrame为我们提供了一个强大而灵活的数据结构&#xff0c;使得数据的清洗、分析和可视化变得更加简便。在本文中&#xff0c;我们将深入…

leetcode hot100爬楼梯

在本题目中&#xff0c;要求爬第n阶有多少种爬法&#xff0c;并且每次只能爬1个或者2个&#xff0c;这明显是动态规划的问题&#xff0c;我们需要用动态规划的解决方式去处理问题。动态规划就是按照正常的顺序由前向后依次推导。而递归则是从结果往前去寻找&#xff08;个人理解…

Android 9.0 禁用adb shell input输入功能

1.前言 在9.0的系统rom产品开发中,在进行一些定制开发中,对于一些adb shell功能需要通过属性来控制禁止使用input 等输入功能,比如adb shell input keyevent 响应输入事件等,所以就需要 熟悉adb shell input的输入事件流程,然后来禁用adb shell input的输入事件功能,接…