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 标签*** 第一种用法:…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...

密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...