c/c++操作xml库-Tinyxml2入门及高级用法

article/2025/9/25 11:11:45

一、概念

TinyXML2是一个开源、简单、小巧、高效的C++ XML解析器,它只有一个.h文件和一个.cpp文件组成,可以轻松集成到其它程序中。它解析XML文档并从中构建可以读取、修改和保存的文档对象模型(Document Object Model, DOM)。它不能解析DTD(Document Type Definitions, 文档类型定义)或XSL(eXtensible Stylesheet Language, 扩展样式表语言)。在TinyXML2中,XML数据被解析为可以浏览和操作的C++对象,然后写入磁盘和其它输出流。它不依赖于C++的STL。

TinyXML2的license为ZLib,可以商用,它的源码在https://github.com/leethomason/tinyxml2 ,最新发布版本为7.1.0。

基本类型

XMLAttribute 是解析 XML 的属性的类,XML 中的属性都与 XML 的 Element 绑定,并且为 key-value 类型。

XMLComment 主要是处理 XML 注释的类,注释的存储形式为""。

XMLDeclaration 主要是处理 XML 中声明的类,声明的存储形式为"<? declaration ?>"。 XMLDocument 代表 XML 整个实体,TinyXML2 中只有 XMLDocument 类可以被实例化,其他的类必

须通过 XMLDocument 提供的 new 方法进行实例化,而不能直接实例化。XMLNode

的其他实体类把构造函数定义为 protected,不能被外部实例化,这样保证使用 XMLDocument 进行内存的管理,避免产生内存泄漏的风险。

XMLElement XMLElement 类是 XMLNode 中最重要的一个类,其存储方式有和 两 种 形 式 , 它 包 含 了 一 个 XMLAttribute 的 根 指 针 , 这 个 root 指 针 指 向 XMLAttribute 的第一个属性键值对。

XMLHandle 主要用来访问元素。

XMLNode 是几乎 XML 所有元素(XMLAttribute 除外)的基类,XML 本质是一种树形结构,而 整个 XML 就是由许多的节点(XMLNode)组成,在 TinyXML2 中每个 XMLNode 节点都 保存了父亲、前驱、后继、孩子头节点和孩子尾节点信息,便于查询、插入、检 索。

XMLPrinter 是 XMLVisitor 类的子类,主要实现的写 XML 的功能,其提供了两种书写方式,一 是构建 XMLDocument,二是直接 push 字段。

XMLText 主要是处理 XML 文本的类,文本信息又分为 CDATA 和普通文本。CDATA 是有专属的 开始字符"<![CDATA[“,而普通的文本存储形式如”>text<"。

XMLUnknown 存储形式为"<! unknown>"。

XMLVisitor 访问者模式的基类,它主要定义了访问者的接口,而在 XMLNode 的子类的 accept 方法中调用这些方法来完成对自身的访问。
在这里插入图片描述

————————————————
版权声明:本文为CSDN博主「jenie」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jenie/article/details/106729883

二、引入

在include中放入tinyxml2.h
在source中放入tinyxml2.cpp

#include "tinyxml2.h"
using namespace tinyxml2;

三、加载

方法一 加载文件

#define TEST_PATH "/tmp/test.xml";XMLDocument doc; 
if (doc.LoadFile(TEST_PATH ) != XMLError::XML_SUCCESS) {std::cout << "load xlm file failed" << std::endl;return;
}

方法二 创建空文档


const string XML_HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";XMLDocument doc; 
doc.Parse(XML_HEADER.data());

四、基本操作

1、创建新节点

# 新增根节点
XMLElement* config = doc.NewElement( "config" );
doc.InsertEndChild( config );# 新增下级节点
XMLElement* e = doc.RootElement()->FirstChildElement("node1");
// 可以替换为
// XMLElement* e = config ->FirstChildElement("node1");
if(e == NULL){e = doc.NewElement( "node1" );doc.RootElement()->InsertEndChild( e  );// 或者// config->InsertEndChild( e  );
}

2、查询节点

XMLElement* e = doc.RootElement()->FirstChildElement("node1");

3、 遍历每个节点

for (XMLElement* currentele = doc.RootElement()->FirstChildElement(); currentele; currentele = currentele->NextSiblingElement())
{const char* name = currentele->Name();}

4、 获取节点名称

const char* name = e->Name();

5、 删除节点

doc.RootElement()->DeleteChild(e);

6、 添加text

XMLText* value = doc.NewText("OFFLINE");
e->InsertEndChild(value);

7、 获取text

const char* text = e->GetText();
int64_t intValue= p->FirstChildElement("ExposureTime")->Int64Text();
bool flag= p->FirstChildElement("TriggerMode")->BoolText();

8、修改text值

e->SetText("vlue")

9、查找属性

const char*name,*value;
const XMLAttribute *valueAttr = e->FirstAttribute();
if (valueAttr != NULL){name = e->Name();value = valueAttr->Value();int port = atoi(valueAttr->Value());this->web_port = port;LOG_INFO("指定了web端口:%d",port);
}// 查找指定属性
const XMLAttribute *valueAttr = e->FirstAttribute("value");

10、获取属性值

/*
const char *tinyxml2::XMLElement::Attribute(const char *name, const char *value = (const char *)0) const
Given an attribute name, Attribute() returns the value
for the attribute of that name, or null if none
exists. For example:@verbatim
const char* value = ele->Attribute( "foo" );
@endverbatimThe 'value' parameter is normally null. However, if specified,
the attribute will only be returned if the 'name' and 'value'
match. This allow you to write code:@verbatim
if ( ele->Attribute( "foo", "bar" ) ) callFooIsBar();
@endverbatimrather than:
@verbatim
if ( ele->Attribute( "foo" ) ) {
if ( strcmp( ele->Attribute( "foo" ), "bar" ) == 0 ) callFooIsBar();
}
@endverbatim
*/
const char* value = e->Attribute("Name")

判断属性值是否一致

if ( ele->Attribute( "foo", "bar" ) ) doSomething();

也可以这样写

if ( ele->Attribute( "foo" ) ) {if ( strcmp( ele->Attribute( "foo" ), "bar" ) == 0 ) doSomething();
}

11、 设置属性

e->SetAttribute("value", metadataUrl.data());e->SetAttribute("type", "home");
e->SetAttribute("price", 1000);
e->SetAttribute("wifi", true);

12、删除属性

e->DeleteAttribute("value");

13、 保存文件

// 保存到文件
int result=doc.SaveFile(TEST_PATH );
sync();

14、 获取xml字符串

XMLPrinter printer;
doc.RootElement()->Accept( &printer );
string xmltext = printer.CStr();char *temp = (char *)malloc(xmltext.length()+1); 
strcpy(temp,xmltext.data());  //间接赋值
*(event->body) = temp;  

参考:https://blog.csdn.net/fengbingchun/article/details/99689509


http://chatgpt.dhexx.cn/article/DmAihVyV.shtml

相关文章

关于Anaconda卸载干净的问题【已解决】

在卸载anaconda时&#xff0c;为了卸载干净&#xff0c;一般会在win10自带的 应用与功能中选择anaconda 进行卸载。 &#xff0c;也可以用anaconda文件中卸载程序Uninstall-Anaconda3.exe进行卸载。 然后再把相应路径下的剩余文件删掉。 但是&#xff01; 这还不够&#xff0c…

anaconda卸载后重装问题

记录一下anaconda卸载后&#xff0c;重新安装后缺少很多文件&#xff0c;重装后打开Anaconda Navigator&#xff0c;发现内容一片空白&#xff0c;软件也不见了&#xff0c;库也不见了&#xff0c;开始菜单也没有anaconda和anaconda prompt&#xff0c;只有如下很少的文件。网上…

如何彻底卸载Anaconda3

阅览了其他大神的卸载文章后&#xff0c;如 https://blog.csdn.net/qq_40605139/article/details/95249601 这篇就给了我很多指导&#xff0c;但我在运行第一句的 conda install anaconda-clean 后就出错了&#xff0c;提示截图如下&#xff1a; 然后就是各种百度&#xff0c;…

Anaconda卸载后重装过程

文章目录 前言一、卸载二、删除注册表三、下载安装包四、安装五、改环境变量六、检验参考文章 前言 因为之前装虚拟机的时候清理磁盘被迫卸掉anaconda&#xff0c;现在又要用jupyter notebook写作业&#xff0c;所以重新装了一遍&#xff0c;记录一下过程备用&#xff0c;也是…

anaconda卸载后重装的悲剧

在经历了无比绝望的一天后&#xff0c;我终于在意志消磨完的最后一刻成功完成了anaconda的卸载重装&#xff0c;这一天过的可以说是非常绝望了。上午还在开开心心的准备下载pytorch库进行学习&#xff0c;结果在更新依赖库的时候没有使用虚拟环境结果导致anaconda崩了&#xff…

CentOS安装/卸载Anaconda(图文详解)

目录 一、Anaconda下载 二、安装Anaconda 三、添加环境 四、卸载 1.删除anaconda文件目录 2.清理.bashrc中的Anaconda路径 一、Anaconda下载 众所周知的原因&#xff0c;从官网下载Anaconda非常慢&#xff0c;因此为了加速下载&#xff0c;这里我们采取清华源下载。 不…

Anaconda安装、查看、卸载第三方库

Anaconda安装第三方库&#xff1a; 下载第三方库&#xff1a;下载地址&#xff1a;https://www.lfd.uci.edu/~gohlke/pythonlibs/ 1、CtrlF 查找 2、下载&#xff0c;点击即可&#xff0c;注意下载的文件要与python环境相匹配 3、将下载的 .whl文件放入...yourpath....\Ana…

恢复anaconda环境, 卸载anaconda, 重装anaconda

在重装anaconda前思考一下是因为什么原因才要重装&#xff0c;如果是因为自己原先的配置好的环境变量在更新时候错乱了&#xff0c;其实可以通过回滚来回复的。 回滚 如果只是为了回复anaconda的环境&#xff0c;其实可以通过命令首先查看anaconda的 环境的历史记录&#xff0…

conda 的安装和卸载

conda 的安装和卸载 针对 ubuntu20.04 ubuntu20.04 是 “西柚云” 主要使用的操作系统 西柚云官网 文章目录 conda 的安装和卸载安装卸载重装 安装 下载 conda 的安装脚本&#xff08;这里使用清华大学的镜像&#xff09; cd ~ # 推荐将 conda 安装在家目录下 wget -c https…

彻底卸载并重装Anaconda环境与Python的方法

本文介绍在Windows平台下&#xff0c;彻底删除Anaconda环境与其自带Python版本&#xff0c;并进行重新安装的方法。 最近&#xff0c;由于原有Anaconda环境中的部分第三方库出现了冲突的情况&#xff0c;且基于“Anaconda Prompt (anaconda3)”也无法升级Anaconda与相关库了&am…

[转载] 怎样彻底卸载anaconda?

彻底卸载anaconda的方法&#xff1a;1、安装Anaconda-Clean package&#xff1b;2、执行【anaconda-clean --yes】命令&#xff1b;3、运行Uninstall-Anaconda3.exe程序即可。 1、安装 Anaconda-Clean package 记得要以管理员身份打开 打开 Anaconda Prompt&#xff0c; 输…

超详细彻底卸载Anaconda详细教程

一、在开始处打开Anaconda Prompt 二、打开后&#xff0c;输入conda install tqdm -f命令并按回车键 conda install tqdm -f三、之后页面会出现一个WANNING&#xff0c;这个我们不用在意&#xff0c;然后会出现一个y/n提示框&#xff0c;在这里我们输入y或者Y y四、输入cond…

关于anaconda的使用和Python库的安装、卸载

本文主要内容 一、anaconda1、anaconda的作用2、一些常用的anaconda命令 二、Python库的安装方法一&#xff1a;pycharm解释器中进行添加&#xff08;一般不推荐&#xff0c;速度慢&#xff09;方法二、控制面板中进行安装&#xff08;最常用&#xff09;方法三、离线安装 三、…

Unbuntu卸载anaconda(最新最全亲测)

文章目录 前言一、删除anaconda文件夹二、删除Anaconda的环境变量总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启了学习机器学习&#x…

一、如何完全卸载Anaconda(如何下载Anaconda-Clean package)

因为一些不可描述的原因必须要卸载Anaconda。 一、在我的Anaconda不可用后&#xff0c;按照其他博主的方法进行尝试卸载Anaconda&#xff0c;发现Anaconda--clean安装不可使用&#xff0c; 二、之后我苦苦寻找方法&#xff0c;发现都不怎么可行&#xff0c;直到我碰到一位博主的…

如何卸载、删除Anaconda?

Anaconda这么好用&#xff0c;为啥要删呢&#xff1f;当然是我之前装得乱七八糟&#xff0c;导致现在心情不好。我要把它全部删掉&#xff01; ok&#xff0c;开始~ 删除思路&#xff1a; 首先利用anaconda-clean清理包清理配置文件&#xff0c;然后直接用安装目录下的卸载程序…

anaconda 完全卸载——重装

由于安装环境的时候不知道什么地方出错了&#xff0c;导致conda下载不了新的包&#xff0c;也不能更新现有的包&#xff0c;所以采取卸载anaconda并重装的方法&#xff08;简答粗暴&#xff09; 卸载 在网上搜集资料&#xff0c;发现卸载anaconda的方法五花八门&#xff0c;而…

如何彻底卸载Anaconda?

文章目录 0.前言1.解决方案1.1方案11.2方案2 2.参考文档 0.前言 本机Win10。  最好的参考文档是官方文档Uninstalling Anaconda。除此以外&#xff0c;再辅助以其他文档&#xff0c;就能达到如标题所示的目的。整个删除过程不难。 1.解决方案 1.1方案1 官方推荐的方案是两种…

Anaconda3完全卸载+重新安装(2022.7)全网最新

目录 完全卸载 原因&#xff1a; 完全卸载步骤&#xff1a; 重新安装 从镜像源安装 新建环境默认在C盘&#xff1f; 参考文献 完全卸载 原因&#xff1a; 1、之前安装的Anaconda3版本过于旧&#xff0c;python版本最新只有3.8&#xff0c;为了使用最新的python3.10&…

anaconda完全卸载方法

完全卸载步骤 进入命令行模式删除虚拟环境下载anaocnda-clean执行anaconda-clean --yes执行卸载程序删除剩余相关文件删除注册表 由于自己的anaconda版本太老了一直没更新&#xff0c;想更新一下&#xff0c;但未更新成功&#xff0c;于是想要重新卸载安装&#xff0c;本次卸载…