【XML】TinyXML 详解(二):接口详解
【C++】郭老二博文之:C++目录
1、XML测试文件(laoer.xml)
<?xml version="1.0" standalone="no" ?>
<!-- Hello World !-->
<root><child name="childName" id="1"><c_child name="c_child1Name" id="1">Text</c_child><c_child name="c_child2Name" id="2">Text</c_child><c_child name="c_child3Name" id="3">Text</c_child></child><child name="childName" id="2">Text</child><child name="childName" id="3"><c_child name="c_child1Name" id="1">Text</c_child><c_child name="c_child2Name" id="2">Text</c_child><c_child name="c_child3Name" id="3">Text</c_child><c_child name="c_child4Name" id="4">Text</c_child><c_child name="c_child5Name" id="5">Text</c_child><c_child name="c_child6Name" id="6">Text</c_child></child><child1 name="child1Name" id="4">Text</child1><child2 name="child1Name" id="5">Text</child1><child3 name="child1Name" id="6">Text</child1>
</root>
2、读取文件并打印
加载xml文件:TiXmlDocument::LoadFile()
获取错误信息:TiXmlDocument::ErrorDesc()
打印XML内容:TiXmlDocument::Print( stdout )
#include <iostream>
#include <sstream>#include "tinyxml.h"using namespace std;int main()
{TiXmlDocument doc( "laoer.xml" );bool loadOkay = doc.LoadFile();if ( !loadOkay ){printf( "Could not load file 'gw.xml'. Error='%s'. Exiting.\n", doc.ErrorDesc() );exit( 1 );}doc.Print( stdout );
}
4、属性相关接口
4.1 获取属性
获取属性有四类接口
- Attribute :获取属性,如果返回空,则表示不存在
- QueryStringAttribute:获取属性,返回值“错误检查”值
- C++ STL(使用std::string)
- C++模版接口
1)Attribute 原型如:
const char* Attribute( const char* name ) const;
const char* Attribute( const char* name, int* i ) const;
const char* Attribute( const char* name, double* d ) const;
……
2)QueryStringAttribute 原型如:
int QueryIntAttribute( const char* name, int* _value ) const;
int QueryDoubleAttribute( const char* name, double* _value ) const;
……
3)C++ STL(使用std::string) 原型如:
const std::string* Attribute( const std::string& name ) const;
const std::string* Attribute( const std::string& name, int* i ) const;
const std::string* Attribute( const std::string& name, double* d ) const;int QueryIntAttribute( const std::string& name, int* _value ) const;
int QueryDoubleAttribute( const std::string& name, double* _value ) const;
……
4)C++模版接口 原型如:
template< typename T > int QueryValueAttribute( const std::string& name, T* outValue ) const
4.2 设置属性
1)SetAttribute 原型如:
void SetAttribute( const char* name, const char * _value );
void SetAttribute( const char * name, int value );
2)SetDoubleAttribute 原型如:
void SetDoubleAttribute( const char * name, double value );
3)C++STL(使用std::string) 原型如:
void SetAttribute( const std::string& name, const std::string& _value );
void SetAttribute( const std::string& name, int _value );
void SetDoubleAttribute( const std::string& name, double value );
void printNameID(const TiXmlElement * const element)
{std::string name;if (element->QueryStringAttribute( "name", &name ) != TIXML_SUCCESS){std::cout << "[ERR] QueryStringAttribute " << std::endl;}int id = -1;if (!element->Attribute("id", (int*)&id)){std::cout << "[ERR] Attribute(id " << std::endl;}std::cout << "name = " << name <<"; id = " <<id << std::endl;
}
4.3 删除属性
void RemoveAttribute( const char * name );
void RemoveAttribute( const std::string& name )
5、遍历子元素
1)返回第一个子元素:TiXmlElement* TiXmlNode::FirstChildElement()
2)返回第一个匹配“value”的子元素:TiXmlElement* TiXmlElement* FirstChildElement( const std::string& _value )
3)返回下一个兄弟元素:TiXmlElement* NextSiblingElement()
4)返回下一个匹配“value”的兄弟元素:TiXmlElement* NextSiblingElement( const std::string& _value)
#include <iostream>
#include <sstream>#include "tinyxml.h"using namespace std;int main()
{TiXmlDocument doc( "laoer.xml" );TiXmlNode* rootNode = 0;TiXmlElement* rootElement = 0;rootNode = doc.FirstChild( "root" );rootElement = rootNode->ToElement();for( childElement = rootElement->FirstChildElement("child");childElement;childElement = childElement->NextSiblingElement("child") ){printNameID(childElement);}
}
6、TiXmlHandle 类
6.1 检查空指针
TiXmlHandle主要用来检测空节点指针(null)的类。
注意:TiXmlHandle 不是DOM 元素树的一部分,类关系如下

例如,遍历如下XML文档:
<Document><Element attributeA = "valueA"><Child attributeB = "value1" /><Child attributeB = "value2" /></Element>
<Document>
TiXmlElement每次获取子元素后,都需要检查是否为NULL,否则操作NULL空指针将会报错
TiXmlElement* root = document.FirstChildElement( "Document" );
if ( root )
{TiXmlElement* element = root->FirstChildElement( "Element" );if ( element ){TiXmlElement* child = element->FirstChildElement( "Child" );if ( child ){TiXmlElement* child2 = child->NextSiblingElement( "Child" );if ( child2 ){// Finally do something useful.
使用 TiXmlHandle 可以简化上面的操作
TiXmlHandle docHandle( &document );
TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement();
if ( child2 )
{// do something useful
6.2 遍历元素
下面使用while循环遍历元素,看上去很合理,其实Child方法内部是一个线性遍历来查找元素,即下面的示例是两个嵌入的while循环
int i=0;
while ( true ){TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).ToElement();if ( !child )break;// do something++i;}
代替方法:
TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).ToElement();for( child; child; child=child->NextSiblingElement("Child") )
{// do something
}
注意上面 NextSiblingElement(“Child”) 和 NextSiblingElement()的区别
6.3 常用接口
TiXmlHandle FirstChild() const;//返回第一个子节点的句柄:
TiXmlHandle FirstChild( const std::string& _value ) const; //返回给定名称的第一个子节点的句柄。
TiXmlHandle FirstChildElement() const;//返回第一个子元素的句柄。
TiXmlHandle FirstChildElement( const std::string& _value ) const;//返回给定名称的第一个子元素的句柄。
TiXmlHandle Child( int index ) const;//返回指定索引“index”子节点的句柄。
TiXmlHandle Child( const std::string& _value, int index ) const;//返回给定名称、指定索引“index”子节点的句柄。
TiXmlHandle ChildElement( int index ) const;//返回指定索引“index”子元素的句柄。
TiXmlHandle ChildElement( const std::string& _value, int index ) const//返回给定名称、指定索引“index”子元素的句柄。
获取节点、元素、文本、未知元素的接口
TiXmlNode* ToNode() const
TiXmlElement* ToElement() const
TiXmlText* ToText() const
TiXmlUnknown* ToUnknown() const
7、创建XML
1)TiXmlNode* InsertEndChild( const TiXmlNode& addThis );
在“最后子节点”后添加新节点。如果发生错误则返回NULL。(addThis)是const引用,在内部会被复制addThis.Clone()
2)TiXmlNode* LinkEndChild( TiXmlNode* addThis );
在“最后子节点”后添加新节点,这里addThis 是指针,将被作为链表的一个项,插入到链表中,因此它内存管理将有父节点TiXmlNode接管。
3)TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis );
在指定子节点之前添加子节点。
4)TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis );
在指定的子元素之后添加子元素。
5)TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );
替换指定的节点
6)bool RemoveChild( TiXmlNode* removeThis );
删除指定的节点
#include <iostream>
#include <sstream>#include "tinyxml.h"using namespace std;int main()
{TiXmlDocument doc( "laoer.xml" );TiXmlNode* rootNode = 0;TiXmlElement* rootElement = 0;// 创建新节点 "child3"TiXmlElement child( "child3" );child.SetAttribute( "name", "child3" );child.SetAttribute( "id", "8" );// 创建节点文本TiXmlText text( "text" );// 创建孙子节点1TiXmlElement c_child1( "c_child" );c_child1.SetAttribute( "name", "c_child1" );c_child1.SetAttribute( "id", "1" );// 创建孙子节点2TiXmlElement c_child2( "c_child" );c_child2.SetAttribute( "name", "c_child2" );c_child2.SetAttribute( "id", "2" );// 组装子节点child.InsertEndChild( text );child.InsertEndChild( c_child1 );child.InsertEndChild( c_child2 );// 获取插入点位置,将新节点插入到指定位置childElement = rootElement->FirstChildElement("child2");rootElement->InsertAfterChild( childElement, child );doc.Print( stdout );doc.SaveFile();
}
修改后的XML如下,请自行和博文开头的做对比
<?xml version="1.0" standalone="no" ?>
<!-- Hello World !-->
<root><child name="childName" id="1"><c_child name="c_child1Name" id="1">Text</c_child><c_child name="c_child2Name" id="2">Text</c_child><c_child name="c_child3Name" id="3">Text</c_child></child><child name="childName" id="2">Text</child><child name="childName" id="3"><c_child name="c_child1Name" id="1">Text</c_child><c_child name="c_child2Name" id="2">Text</c_child><c_child name="c_child3Name" id="3">Text</c_child><c_child name="c_child4Name" id="4">Text</c_child><c_child name="c_child5Name" id="5">Text</c_child><c_child name="c_child6Name" id="6">Text</c_child></child><child1 name="child1Name" id="4">Text</child1><child2 name="child1Name" id="5">Text</child2><child3 name="child3" id="8">text<c_child name="c_child1" id="1" /><c_child name="c_child2" id="2" /></child3><child3 name="child1Name" id="6">Text</child3>
</root>
相关文章:
【XML】TinyXML 详解(二):接口详解
【C】郭老二博文之:C目录 1、XML测试文件(laoer.xml) <?xml version"1.0" standalone"no" ?> <!-- Hello World !--> <root><child name"childName" id"1"><c_child…...
【机器学习】人工智能概述
人工智能(Artificial Intelligence,简称AI)是一门研究如何使机器能够像人一样思考、学习和执行任务的学科。它是计算机科学的一个重要分支,涉及机器学习、自然语言处理、计算机视觉等多个领域。 人工智能的概念最早可以追溯到20世…...
flink 实时写入 hudi 参数推荐
数据湖任务并行度计算...
传统项目基于tomcat cookie单体会话升级分布式会话解决方案
传统捞项目基于servlet容器 cookie单体会话改造分布式会话方案 ##引入redis,spring-session依赖 <!--redis依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>&…...
Unity 关于json数据的解析方式(LitJson.dll插件)
关于json数据的解析方式(LitJson.dll插件) void ParseItemJson(){TextAsset itemText Resources.Load<TextAsset>("Items");//读取Resources中Items文件,需要将Items文件放到Resources文件夹中string itemJson itemText.te…...
智能监控平台/视频共享融合系统EasyCVR海康设备国标GB28181接入流程
TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…...
expdp到ASM 文件系统 并拷贝
1.创建asm导出数据目录 sql>select name,total_mb,free_mb from v$asm_diskgroup; 确认集群asm磁盘组环境 asmcmd>cd DGDSDB asmcmd>mkdir dpbak asmcmd>ls -l sql>conn / as sysdba create directory expdp_asm_dir as DGDSDB/dpbak; create directory expdp_l…...
【2023】通过docker安装hadoop以及常见报错
💻目录 1、准备2、安装镜像2.1、创建centos-ssh的镜像2.2、创建hadoop的镜像 3、配置ssh网络3.1、搭建同一网段的网络3.2、配置host实现互相之间可以免密登陆3.3、查看是否成功 4、安装配置Hadoop4.1、添加存储文件夹4.2、添加指定配置4.3、同步数据 5、测试启动5.1…...
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取相机当前实时帧率(C++)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取相机当前实时帧率(C) Baumer工业相机Baumer工业相机的帧率的技术背景Baumer工业相机的帧率获取方式CameraExplorer如何查看相机帧率信息在NEOAPI SDK里通过函数获取相机帧率(C) …...
SpringBoot项目部署及多环境
1、多环境 2、项目部署上线 原始前端 / 后端项目宝塔Linux容器容器平台 3、前后端联调 4、项目扩展和规划 多环境 程序员鱼皮-参考文章 本地开发:localhost(127.0.0.1) 多环境:指同一套项目代码在把不同的阶段需要根据实际…...
WebGL以及wasm的介绍以及简单应用
简介 下面主要介绍了WebGL和wasm,是除了html,css,js以外Web标准所支持的另外两个大件 前者实现复杂的图形处理,后者提供高效的代码迁移以及代码执行效率 WebGL 简介 首先,浏览器里的游戏是怎么做到这种交互又显示不同的画面的? 试想用我们的前端三件套实现一下.好像可以…...
JS和TS的基础语法学习以及babel的基本使用
简介 本文主要介绍了一下js和ts的基础语法,为前端开发zuo JavaScript 更详细的 JavaScript 学习资料:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript 简介 定位 : JavaScript 是一种动态语言,它包含类型、运算符、标准内置( bu…...
Centos安装Composer
今天分享下如何在centos系统里安装composer 一、下载composer curl -sS https://getcomposer.org/installer | php二、移动或复制composer到环境下可执行 cp composer.phar /usr/local/bin/composer三、测试看是否安装成功 composer -V四、全局安装 curl -sS https://getc…...
面试题:从 MySQL 读取 100w 数据进行处理,应该怎么做?
文章目录 背景常规查询流式查询MyBatis 流式查询接口为什么要用流式查询? 游标查询OptionsResultType注意:原因: 非流式查询和流式查询区别: 背景 大数据量操作的场景大致如下: 数据迁移数据导出批量处理数据 在实际…...
销售转行上位机编程:我的学习与职业经历分享
同学们好,我是杨工,原先是一名销售。 通过在华山编程培训中心学习,成功转行上位机编程,对此我想分享学习和职业经历。 在职业生涯的早期,我并没有考虑将技术融入到我的工作中。然而,在几次创业的失败后&a…...
分库分表之Mycat应用学习一
1 为什么要分库分表 1.1 数据库性能瓶颈的出现 对于应用来说,如果数据库性能出现问题,要么是无法获取连接,是因为在高并发的情况下连接数不够了。要么是操作数据变慢,数据库处理数据的效率除了问题。要么是存储出现问题…...
Windows下Qt使用MSVC编译出现需要转为unicode的提示
参考 Qt5中文编码问题解决办法_qt5设置编码-CSDN博客 致敬 提示:warning: C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失。 出现此问题,应该是Unix格式下代码的编码格式是UTF-8,注意不…...
【数值分析】乘幂法,matlab实现
乘幂法 一种求实矩阵 A {A} A 的按模最大的特征值,及其对应的特征向量 x i {x_i} xi 的方法,只能求一个。特别适合于大型稀疏矩阵。 一个矩阵的特征值和特征向量可以通过矩阵不断乘以一个初始向量得到。 每次乘完之后要规范化,防止上溢或…...
视频监控EasyCVR如何通过设置sei接口,实现在webrtc视频流中添加画框和文字?
安防视频监控系统基于视频综合管理平台EasyCVR视频系统,采用了开放式的网络结构,可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力,具备权限管…...
智能三维数据虚拟现实电子沙盘
一、概述 易图讯科技(www.3dgis.top)以大数据、云计算、虚拟现实、物联网、AI等先进技术为支撑,支持高清卫星影像、DEM高程数据、矢量数据、无人机倾斜摄像、BIM模型、点云、城市白模、等高线、标高点等数据融合和切换,智能三维数…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
