tinyxml2
使用tinyxml2,得知道一些xml基础
xml tutorial--菜鸟
tinyxml2类对象
链接
结构

XMLNode
什么是节点
节点:元素、声明、文本、注释等。
XMLDocument
xml文档(文件)对象。
作用:
加载xml文件,
tinyxml2作用
先定义两个宏
#ifndef XMLCheckResultDocu#define XMLCheckResultDocu(eResult,object) if (eResult != XML_SUCCESS) { printf("Error: %s\n", object->ErrorStr()); return eResult; }
#endif
#ifndef XMLCheckResult#define XMLCheckResult(eResult) if (eResult != XML_SUCCESS) { printf("Error: %i\n", eResult); return eResult; }
#endif
1,extract xml文件内容
提取一个元素所有属性
if(node->ToElement()) {auto element = dynamic_cast<XMLElement*>(node);cout << "XML 元素,name=" << element->Name() << ", value=" << element->Value() << endl;const XMLAttribute* attribute = element->FirstAttribute();while (attribute != nullptr) {cout << "\t属性 " << attribute->Name() << "=" << attribute->Value() << endl;attribute = attribute->Next();}}
元素的name和value是什么
元素的名称(Name)指的是元素的标签名,例如 `<book>` 元素的名称为 "book"。
元素的值(Value)指的是元素包含的文本内容,也称为元素的数据(Data)。在 XML 中,元素的值位于开始标记和结束标记之间,例如 `<book>XML Basics</book>` 中的值为 "XML Basics"。
需要注意的是,元素的值和元素的属性并不是同一概念。元素的属性是位于元素开始标记中的信息,用于描述元素的附加属性和特征。元素的值则是位于元素开始标记和结束标记之间的文本内容,描述了元素的数据内容。
提取一个节点的所有子节点和兄弟节点
void traversingXML(XMLNode* node) {printf(node->Value());if(node->NoChildren()) return;XMLNode* child = node->FirstChild();while(child != nullptr) {traversingXML(child);child = child->NextSibling();}
}
获取xml文档的第一个节点
注意:第一个节点不一定是element的根节点,可能是declaration,或者其他类型。
在 XML 中,根节点(root node)是整个 XML 文档的最上层节点,所有其他节点都是根节点的子节点或后代节点。
根节点是 XML 文档中唯一一个没有父节点的节点。它通常是整个 XML 文档的第一个节点,也是唯一一个与 XML 文档的命名空间相关的节点。在 XML 中,根节点与 XML 文档的首行(XML 声明)一起构成了完整的 XML 文档头部信息。
点一个 XML 文件只有一个根节点,所有其他节点都是根节点的子节点,或者子节点的子节等。根节点的格式如下所示:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<!-- other nodes... -->
</root>
```
在示例中,`<root>` 是根节点。根节点可以包含其他节点,例如元素节点、注释节点、文本节点等。在 XML 解析和处理时,可以通过访问根节点来遍历整个 XML 文档,并处理其中的数据内容。
XMLNode * pRoot = xmlDoc.FirstChild();
if (pRoot == nullptr) return XML_ERROR_FILE_READ_ERROR;
获取根元素
XMLElement* getRootElement(XMLNode* node){if(node==nullptr){std::cout<<"can not get root element,node is empty."<<std::endl;return nullptr;}XMLNode *child=node;while(child){if(child->ToElement()!=nullptr) return (child->ToElement());child=child->NextSibling();}return nullptr;
}
Query查询元素指定类型的text,并且获取
QueryXXXText()
int iOutInt;
eResult = pElement->QueryIntText(&iOutInt);
XMLCheckResult(eResult);
如果text不能convert为指定的类型,机会返回失败。
Query查询元素指定类型的属性,并提取
int iOutDay, iOutYear;eResult = pElement->QueryIntAttribute("day", &iOutDay);
XMLCheckResult(eResult);eResult = pElement->QueryIntAttribute("year", &iOutYear);
XMLCheckResult(eResult);
2,创建xml文件内容
链接
案例:
#include <iostream>
#include "tinyxml2/tinyxml2.h"using namespace tinyxml2;void createXML(){XMLDocument document;XMLDeclaration* declaration=document.NewDeclaration("xml version='1.0' encoding='UTF-8'");XMLComment* comment=document.NewComment("This is a comment");XMLUnknown* unknown=document.NewUnknown("unknown type");XMLElement* person=document.NewElement("person");person->SetAttribute("name","laowang");person->SetAttribute("age","22");person->SetAttribute("gender","man");XMLElement* addr=document.NewElement("address");addr->SetAttribute("name","guangnan");addr->SetAttribute("postion","sourthwest");XMLElement* enterprise=document.NewElement("enterprise");enterprise->SetAttribute("first","stuudent");enterprise->SetAttribute("second","xiaobai");enterprise->SetAttribute("third","peitian");XMLElement* success=document.NewElement("success");success->SetAttribute("stage","highest");XMLText* text=document.NewText("baby to you");success->InsertEndChild(text);enterprise->InsertEndChild(success);person->InsertEndChild(addr);person->InsertEndChild(enterprise);document.InsertEndChild(declaration);document.InsertEndChild(comment);document.InsertEndChild(unknown);document.InsertEndChild(person);document.SaveFile("person.xml");
}int main(){createXML();return 0;
}
生成的xml文件:

函数
外网链接
链接1
链接2
链接3
new类型的函数
比如newElement()
XMLNode * InsertFirstChild(XMLNode *addThis)
XMLNode * InsertAfterChild(XMLNode *afterThis, XMLNode *addThis)
XMLNode * InsertEndChild(XMLNode *addThis)
void DeleteChild(XMLNode *node)
void DeleteChildren()
SetText()
重载函数,参数类型可以多种。
设置text的。
所以说,一个元素的text可以建立XMLText对象,然后insert;也可以用这个函数直接生成。
SetValue()
设置元素名称
element的函数
`Attribute()`:获取指定名称的属性值
- `FindAttribute()`:查找指定名称的属性
- `FirstAttribute()`:获取第一个属性
element对text的处理函数
XMLElement中,name,value,text的区别
name和value返回的都是元素的name,GetText返回的才是元素的text.
Value():
void printElementAllInfo(XMLElement* rootElement,int level){if(rootElement==nullptr) return;int le=level;while(le--) std::cout<<" ";std::cout<<"element name:"<<rootElement->Name();// if(rootElement->GetText()){// std::cout<<"text data:"<<rootElement->GetText();// }if(rootElement->Value()){std::cout<<" text data:"<<rootElement->Value();}std::cout<<std::endl;le=level;while(le--) std::cout<<" ";std::cout<<rootElement->Name()<<" attribute:"<<std::endl;const XMLAttribute* attirbute=rootElement->FirstAttribute();while(attirbute){le=level;while(le--) std::cout<<" ";std::cout<<attirbute->Name()<<"="<<attirbute->Value()<<std::endl;attirbute=attirbute->Next();}//print child element of his elementprintElementAllInfo(rootElement->FirstChildElement(),level+1);//print sibling element of this elementprintElementAllInfo(rootElement->NextSiblingElement(),level);
}
GetText():
void printElementAllInfo(XMLElement* rootElement,int level){if(rootElement==nullptr) return;int le=level;while(le--) std::cout<<" ";std::cout<<"element name:"<<rootElement->Name();if(rootElement->GetText()){std::cout<<"text data:"<<rootElement->GetText();}std::cout<<std::endl;le=level;while(le--) std::cout<<" ";std::cout<<rootElement->Name()<<" attribute:"<<std::endl;const XMLAttribute* attirbute=rootElement->FirstAttribute();while(attirbute){le=level;while(le--) std::cout<<" ";std::cout<<attirbute->Name()<<"="<<attirbute->Value()<<std::endl;attirbute=attirbute->Next();}//print child element of his elementprintElementAllInfo(rootElement->FirstChildElement(),level+1);//print sibling element of this elementprintElementAllInfo(rootElement->NextSiblingElement(),level);
}

判断element中有没有text
通过GetText的返回值。
获取text----GetText()
注意GetText返回指针,而且text不一定存在,所以一定要对GetText的返回值进行判断。
获取element的下一个兄弟element
rootElement->NextSiblingElement()
获取元素的子元素---firstChildElement()
获取第一个子元素
XMLElement * pElement = pRoot->FirstChildElement();//不使用参数,默认获取第一个子元素
if (pElement == nullptr) return XML_ERROR_PARSING_ELEMENT;
使用元素名称获取元素的指定子元素
XMLElement * pElement = pRoot->FirstChildElement("IntValue");
if (pElement == nullptr) return XML_ERROR_PARSING_ELEMENT;
确保子元素名不同。
attribute的函数
提取属于同一个元素的当前属性的下一个属性---Next()
XMLNode的函数
企图当前节点的下一个兄弟节点---NextSibling()
XMLElement* getRootElement(XMLNode* node){if(node==nullptr){std::cout<<"can not get root element,node is empty."<<std::endl;return nullptr;}XMLNode *child=node;while(child){if(child->ToElement()!=nullptr) return (child->ToElement());child=child->NextSibling();}return nullptr;
}
element因为继承这个,所以有:
1,NextSibling()----注意,这个获取的不一定是element
2,NextSiblingElement()
firstChild()--提取一个节点
注意,firstChild提取的不一定是element,因为这个函数提取的是节点,而不是元素。
element因为继承XMLNode,所以有:
1,firstChild()---注意,这个获取的不一定是element
2,firstChildElement()
tinyxml2错误枚举
文件读取错误
if (pRoot == nullptr) return XML_ERROR_FILE_READ_ERROR;
元素解析错误
XMLElement * pElement = pRoot->FirstChildElement("IntValue");
if (pElement == nullptr) return XML_ERROR_PARSING_ELEMENT;
属性解析错误
szAttributeText = pElement->Attribute("month");
if (szAttributeText == nullptr) return XML_ERROR_PARSING_ATTRIBUTE;
std::string strOutMonth = szAttributeText;
XMLError
enum XMLError {XML_SUCCESS = 0,XML_NO_ATTRIBUTE,XML_WRONG_ATTRIBUTE_TYPE,XML_ERROR_FILE_NOT_FOUND,XML_ERROR_FILE_COULD_NOT_BE_OPENED,XML_ERROR_FILE_READ_ERROR,XML_ERROR_PARSING_ELEMENT,XML_ERROR_PARSING_ATTRIBUTE,XML_ERROR_PARSING_TEXT,XML_ERROR_PARSING_CDATA,XML_ERROR_PARSING_COMMENT,XML_ERROR_PARSING_DECLARATION,XML_ERROR_PARSING_UNKNOWN,XML_ERROR_EMPTY_DOCUMENT,XML_ERROR_MISMATCHED_ELEMENT,XML_ERROR_PARSING,XML_CAN_NOT_CONVERT_TEXT,XML_NO_TEXT_NODE,XML_ELEMENT_DEPTH_EXCEEDED,XML_ERROR_COUNT
};
ErrorStr()
当发生错误时,可以直接使用节点对象的ErrorStr()成员函数输出XMLError的错误类型。
注意:这个函数只有document对象才有,其他类型的节点没有。
#ifndef XMLCheckResultDocu#define XMLCheckResultDocu(eResult,object) if (eResult != XML_SUCCESS) { printf("Error: %s\n", object->ErrorStr()); return eResult; }
#endif
#ifndef XMLCheckResult#define XMLCheckResult(eResult) if (eResult != XML_SUCCESS) { printf("Error: %i\n", eResult); return eResult; }
#endif
相关文章:
tinyxml2
使用tinyxml2,得知道一些xml基础 xml tutorial--菜鸟 tinyxml2类对象 链接 结构 XMLNode 什么是节点 节点:元素、声明、文本、注释等。 XMLDocument xml文档(文件)对象。 作用: 加载xml文件, tinyxml2作用 先定义两个宏 …...
What is `@Controller` does?
Controller 是SpringMVC注解,标记一个类作为Web控制器(Controller),负责处理HTTP请求并返回响应结果 在SpringMVC中,控制器类的主要职责是: 1、接收来自客户端的HTTP请求 2、调用服务层或其他业务逻辑组件…...
新版AndroidStudio dependencyResolutionManagement出错
在新版AndroidStudio中想像使用4.2版本或者4.3版本的AndroidStudio来构造项目?那下面这些坑我们就需要来避免了,否则会出各种各样的问题。 一.我们先来看看新旧两个版本的不同。 1.jdk版本的不同 新版默认是jdk17 旧版默认是jdk8 所以在新版AndroidSt…...
第三天业务题
3-1 你们的项目是如何进行参数校验的 在我们的项目中,通常使用以下2种方式进行参数校验: 1.手动校验:在方法内部,我们可以手动编写代码来对参数进行校验。例如,使用条件判断语句(if-else)来检…...
nestjs 装饰器
1、装饰器定义 装饰器是一种特殊的类型声明,它可以附加在类、方法、属性、参数上边 需开启tsconfig.json中 "experimentalDecorators":true 生成tsconfig.json文件 tsc -init 2、类装饰器 // 类装饰器 主要是通过符号添加装饰器 // 装饰器会自动把cl…...
一款开源且不限制大小可以设置过期时间的支持分享的的开源文件共享系统picoshare 部署教程
1.拉取镜像 2.部署 创建目录 mkdir -p /opt/picoshare/data 部署 其中:"somesecretpass"是密码 docker run \--env "PORT4001" \--env "PS_SHARED_SECRETsomesecretpass" \--publish 10005:4001/tcp \--volume "/opt/picoshare/data:…...
eBPF运行时安全
引言 eBPF作为当前linux系统上最为炙手可热的技术,通常被用于网络流量过滤和分析、系统调用跟踪、性能优化、安全监控,当下比较知名的项目有Cilium、Falco等。 Cilium 是一个开源的容器网络和安全性项目,致力于提供高效的容器通信和强大的安…...
Linux 系统中常见的命令,它们用于执行各种任务,包括文件和目录管理、系统信息查看、用户管理等
以下是一些在 Linux 系统中常见的命令,它们用于执行各种任务,包括文件和目录管理、系统信息查看、用户管理等。这里列举了一些基础的命令: 文件和目录管理: ls: 列出目录内容。 ls cd: 切换当前目录。 cd /path/to/directory …...
AutoEventWireup详解
AutoEventWireup详解 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,让我们深入探讨.NET开发中一个神奇而强大的特性——AutoEventWireupÿ…...
SAP ABAP 自定义流水号 编号范围
前言 在开发中经常会遇到生成编号的需求(如接口报文ID,自建表数据主键等);为此,SAP提供了自动编号工具,能根用户需求设定并自动生成一组唯一的编号。 编号范围对象的创建 1.进入事务代码SNRO,创建一个编号范围对象。…...
安卓、ios系统详解
一、安卓 安卓系统架构:从上至下,依次是应用层、应用框架层、系统运行库层和Linux内核层 应用层(system app):系统内置的应用程序及非系统级的应用程序都属于应用层,负责与用于进行交互,一般都用java或者kotlin来开发应用框架层(java api framework):为应用层提供所需…...
含并行连结的网络(GoogLeNet)
目录 1.GoogLeNet 2.代码 1.GoogLeNet inception不改变高宽,只改变通道数。GoogLeNet也大量使用1*1卷积,把它当作全连接用。 V3耗内存比较多,计算比较慢,但是精度比较准确。 2.代码 import torch from torch import nn from t…...
计算机网络(第六版)复习提纲3
2.3 物理层下面的传输媒体 传输媒体是数据传输系统中在发送器和接收器之间的物理通道,有导引型传输媒体(有线)和非导引型传输媒体(无线) 1.双绞线:两条铜线绞合,以减少干扰,绞合度越…...
怿星科技测试实验室获CNAS实验室认可,汽车以太网检测能力达国际标准
2023年12月27日,上海怿星电子科技有限公司测试实验室(下称:EPT LABS)通过CNAS实验室认可批准,并于2024年1月5日正式取得CNAS实验室认可证书(注册号CNAS L19826),标志着怿星科技的实验…...
GORM 介绍及快速入门
GORM 介绍及快速入门 前言 GORM 是一个用 GoLang 语言编写的 ORM(对象关系映射)库。它被设计为开发者友好的方式来进行数据库操作。GORM 提供了一种高级的 API 来处理数据库的 CRUD(创建、读取、更新、删除)操作,它支…...
Scrcpy:掌握你的Android设备
Scrcpy:掌握你的Android设备 本文将介绍Scrcpy工具,它是一种强大的安卓设备控制工具,可以实现屏幕镜像、操作控制等功能。我们将探讨Scrcpy的基本原理和工作方式,并介绍如何使用Scrcpy连接和控制安卓设备。此外,我们还…...
[9, 8, 7, 6][1,2] = ?
当我们运行这段代码时,控制台中会记录什么值? const arr [9, 8, 7, 6]; const res arr[1, 2]; console.log(res);当我们运行这段代码时,res 的值将是 7。并且控制台中会打印出 7。 让我们来详细分析一下。 第一步:[1, 2] 会被转换成 [2]。 为什么? 后续的元素 [1, 2] …...
docker部署Jira+配置MySQL8数据库
写在前面:如果你通过docker安装Jira且启动过,然后你现在又想使用mysql数据库,需要注意 你除了停掉原有容器,还需要删除:/var/lib/docker/volumes/jiraVolume/_data下的文件,否则启动后会无法正常使用。注意…...
YOLOv5全网独家首发:DCNv4更快收敛、更高速度、更高性能,效果秒杀DCNv3、DCNv2等 ,助力检测实现暴力涨点
💡💡💡本文独家改进:DCNv4更快收敛、更高速度、更高性能,完美和YOLOv5结合,助力涨点 DCNv4优势:(1) 去除空间聚合中的softmax归一化,以增强其动态性和表达能力;(2) 优化存储器访问以最小化冗余操作以加速。这些改进显著加快了收敛速度,并大幅提高了处理速度,DCN…...
HTML中常用标签--详解
目录 1.b/strong标签 2.i/em 标签 3.u标签 4.del删除线 5.br换行 6.p标签 * 7.pre 预处理标签 8.span标签** 9.div标签*** 10.sub标签 11.sup标签 12.hr标签 13.hn标签 14.HTML5中语义标签 特殊字符 15.多媒体标签 img*** a 标签*** 第一种用法:…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

