CentOS 编译安装TinyXml2
安装
TinyXml2 Git 源码下载地址:https://github.com/leethomason/tinyxml2
步骤1:首先,你需要下载tinyxml2的源代码。你可以从Github或者源代码官方网站下载。并上传至/usr/local/source_code/
步骤2:下载完成后,需要将源代码解压,可以使用以下命令:
tar -zxvf tinyxml2-8.1.0.tar.gz

步骤3:解压后,切换到源代码目录:
cd tinyxml2-8.1.0
步骤4:执行make && make install 命令进行安装:
make && make install
温馨提示:完成以上步骤后,在/usr/local/lib下会生成libtinyxml2.so动态库和/usr/local/include下生成tinyxml2.h头文件。你可以使用以下命令查看是否安装成功:
ls /usr/local/lib | grep tinyxml2
ls /usr/local/include | grep tinyxml2
如果看到libtinyxml2.so和tinyxml2.h,则说明成功安装了tinyxml库。
TinyXml2 库
简介
TinyXML2 是简单实用的开源的 C++XML 文件解析库,可以很方便的应用到现有的项 目之中。 TinyXML2 解析器相对 TinyXML1 在代码上是完全重写,使其更适合于游戏开发 中使用。它使用更少的内存,更快,并使用更少的内存分配。
由于 XML 的树状结构,TinyXML2 将 XML 的节点抽象为 XMLNode,XML 中除了把属 性 key-value 抽象为 XMLAttribute 类型外,其余的都看作 XMLNode 的子类,首先将整个 XML 文档抽象为 XMLDocument,将声明部分抽象为 XMLDeclaration,将注释抽象为 XMLComment,将元素抽象为 XMLElement,将文本抽象为 XMLText。
核心:节点、元素、属性和值
XMLAttribute 是解析 XML 的属性的类,XML 中的属性都与 XML 的 Element 绑定,并且为 key-value 类型。
XMLComment 主要是处理 XML 注释的类,注释的存储形式为""。
XMLDeclaration 主要是处理 XML 中声明的类,声明的存储形式为"<? declaration ?>"。 XMLDocument 代表 XML 整个实体,TinyXML2 中只有 XMLDocument 类可以被实例化,其他的类必
须通过 XMLDocument 提供的 new 方法进行实例化,而不能直接实例化。XMLNode
的其他实体类把构造函数定义为 protected,不能被外部实例化,这样保证使用 XMLDocument 进行内存的管理,避免产生内存泄漏的风险。
XMLElement XMLElement 类是 XMLNode 中最重要的一个类,其存储方式有<foo/>和<foo></foo> 两 种 形 式 , 它 包 含 了 一 个 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 方法中调用这些方法来完成对自身的访问。
示例代码
前提条件:在/usr/local/source_code 创建目录:tinyxml_demmo,并创建tinyXmlDemo.cpp文件,文件内容如下:
#include <iostream>
#include "tinyxml2.h"
#include <stdio.h>
#include <stdlib.h>using namespace tinyxml2;/*
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
};
*///创建XML文件
int createXML(const char* xmlPath)
{XMLDocument doc;if (XML_ERROR_FILE_NOT_FOUND != doc.LoadFile(xmlPath)) {std::cout << "file has been existed !" << std::endl;return 0;}//添加声明 <?xml version="1.0" encoding="UTF-8" ?>XMLDeclaration *declaration = doc.NewDeclaration();doc.InsertFirstChild(declaration);XMLElement *root = doc.NewElement("Users");doc.InsertEndChild(root);XMLElement *userNode = doc.NewElement("User");//添加属性userNode->SetAttribute("Name", "milo");userNode->SetAttribute("Password", "pwd");root->InsertEndChild(userNode);return doc.SaveFile(xmlPath);
}void loadXML(const char* xmlPath) {XMLDocument doc;if (doc.LoadFile(xmlPath) != XML_SUCCESS) {std::cout << "load xlm file failed" << std::endl;return;}XMLPrinter printer;doc.Print( &printer);std::cout << printer.CStr();
}//添加性别,号码,邮箱 再添加一个用户
int addXML1(const char* xmlPath) {XMLDocument doc;if (doc.LoadFile(xmlPath) != XML_SUCCESS) {std::cout << "load xlm file failed" << std::endl;return -1;}XMLElement *root = doc.RootElement();XMLElement *userNode = root->FirstChildElement("User");XMLElement *gender = doc.NewElement("Gender");XMLText* genderText = doc.NewText("man");gender->InsertFirstChild(genderText);userNode->InsertFirstChild(gender);XMLElement *mobile = doc.NewElement("Mobile");mobile->InsertFirstChild(doc.NewText("186****3143"));userNode->InsertEndChild(mobile);XMLElement *email = doc.NewElement("Email");email->InsertFirstChild(doc.NewText("472251823@qq.com"));userNode->InsertEndChild(email);XMLElement *userNode2 = doc.NewElement("User");userNode2->SetAttribute("Name", "king");userNode2->SetAttribute("Password", "pwd2");root->InsertEndChild(userNode2);XMLElement *mobile2 = doc.NewElement("Mobile");mobile2->InsertFirstChild(doc.NewText("186****3143"));userNode2->InsertEndChild(mobile2);return doc.SaveFile(xmlPath);
}//在性别后面添加年龄,再添加一个号码
int addXML2(const char* xmlPath)
{XMLDocument doc;if (doc.LoadFile(xmlPath) != XML_SUCCESS){std::cout<<"load xml file failed"<<std::endl;return false;}XMLElement* root=doc.RootElement();XMLElement* userNode=root->FirstChildElement("User");XMLElement* gender = userNode->FirstChildElement("Gender");XMLElement* age = doc.NewElement("Age");age->InsertFirstChild(doc.NewText("18"));userNode->InsertAfterChild(gender,age);XMLElement* mobile = userNode->FirstChildElement("Mobile");mobile->SetAttribute("Location","home");XMLElement* mobile1 = doc.NewElement("Mobile");mobile1->SetAttribute("Location","company");mobile1->InsertFirstChild(doc.NewText("186****3143"));userNode->InsertAfterChild(mobile, mobile1);return doc.SaveFile(xmlPath);
}//删除第一个号码,删除第二个号码的属性
int deleteXML(const char* xmlPath) {XMLDocument doc;if (doc.LoadFile(xmlPath) != XML_SUCCESS) {std::cout << "load xlm file failed" << std::endl;return -1;}XMLElement *root = doc.RootElement();XMLElement *userNode = root->FirstChildElement("User");XMLElement *mobile = userNode->FirstChildElement("Mobile");userNode->DeleteChild(mobile);XMLElement *mobile2 = userNode->FirstChildElement("Mobile");mobile2->DeleteAttribute("Location");return doc.SaveFile(xmlPath);
}//将milo的年龄改为10000岁,将king的号码改为8888结尾
int updateXML(const char* xmlPath) {XMLDocument doc;if (doc.LoadFile(xmlPath) != XML_SUCCESS) {std::cout << "load xlm file failed" << std::endl;return -1;}XMLElement *root = doc.RootElement();XMLElement *userNode = root->FirstChildElement("User");while (userNode != NULL) {if (0 == strncmp("milo", (userNode->Attribute("Name")), 11)) {userNode->FirstChildElement("Age")->SetText("10000");userNode = userNode->NextSiblingElement();} else if (0 == strncmp("king", (userNode->Attribute("Name")), 11)) {userNode->FirstChildElement("Mobile")->SetText("186****8888");userNode = userNode->NextSiblingElement();} else {userNode = userNode->NextSiblingElement();}}return doc.SaveFile(xmlPath);
}//将milo的信息打印出来
int selectXML(const char* xmlPath)
{XMLDocument doc;if(doc.LoadFile(xmlPath)!=XML_SUCCESS){std::cout<<"load xml file failed"<<std::endl;return false;}XMLElement* root=doc.RootElement();XMLElement* userNode=root->FirstChildElement("User");while(userNode != NULL){if( 0 == strncmp("milo",(userNode->Attribute("Name")),11)){std::cout << userNode->Attribute("Name") << std::endl;std::cout << userNode->Attribute("Password") << std::endl;std::cout << userNode->FirstChildElement("Age")->GetText() << std::endl;std::cout << userNode->FirstChildElement("Gender")->GetText() << std::endl;std::cout << userNode->FirstChildElement("Mobile")->GetText() << std::endl;std::cout << userNode->FirstChildElement("Email")->GetText() << std::endl;userNode = userNode->NextSiblingElement();} else {userNode = userNode->NextSiblingElement();}}return 0;
}int main( int argc, const char ** argv )
{char xmlPath[] = "./0voice.xml";/*创建*/createXML(xmlPath);loadXML(xmlPath);printf("------------------------------\n");/*增*/addXML1(xmlPath);loadXML(xmlPath);printf("------------------------------\n");addXML2(xmlPath);loadXML(xmlPath);printf("------------------------------\n");/*删*/deleteXML(xmlPath);loadXML(xmlPath);printf("------------------------------\n");/*改*/updateXML(xmlPath);loadXML(xmlPath);printf("------------------------------\n");/*查*/selectXML(xmlPath);return 0;
}
源码编译,执行如下指令:
g++ tinyXmlDemo.cpp -o tinyXmlDemo -L/usr/local/lib/ -ltinyxml2
执行效果截图:
[root@localhost tinyxml_demmo]# g++ tinyXmlDemo.cpp -o tinyXmlDemo -L/usr/local/lib/ -ltinyxml2
[root@localhost tinyxml_demmo]# ll
总用量 120
-rw-r--r--. 1 root root 168 10月 23 15:36 parseXml.xml
-rwxr-xr-x. 1 root root 110536 10月 23 15:48 tinyXmlDemo
-rw-r--r--. 1 root root 7091 10月 23 15:47 tinyXmlDemo.cpp
[root@localhost tinyxml_demmo]# ./tinyXmlDemo
<?xml version="1.0" encoding="UTF-8"?>
<Users><User Name="milo" Password="pwd"/>
</Users>
------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<Users><User Name="milo" Password="pwd"><Gender>man</Gender><Mobile>186****3143</Mobile><Email>472251823@qq.com</Email></User><User Name="king" Password="pwd2"><Mobile>186****3143</Mobile></User>
</Users>
------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<Users><User Name="milo" Password="pwd"><Gender>man</Gender><Age>18</Age><Mobile Location="home">186****3143</Mobile><Mobile Location="company">186****3143</Mobile><Email>472251823@qq.com</Email></User><User Name="king" Password="pwd2"><Mobile>186****3143</Mobile></User>
</Users>
------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<Users><User Name="milo" Password="pwd"><Gender>man</Gender><Age>18</Age><Mobile>186****3143</Mobile><Email>472251823@qq.com</Email></User><User Name="king" Password="pwd2"><Mobile>186****3143</Mobile></User>
</Users>
------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<Users><User Name="milo" Password="pwd"><Gender>man</Gender><Age>10000</Age><Mobile>186****3143</Mobile><Email>472251823@qq.com</Email></User><User Name="king" Password="pwd2"><Mobile>186****8888</Mobile></User>
</Users>
------------------------------
milo
pwd
10000
man
186****3143
472251823@qq.com
相关文章:
CentOS 编译安装TinyXml2
安装 TinyXml2 Git 源码下载地址:https://github.com/leethomason/tinyxml2 步骤1:首先,你需要下载tinyxml2的源代码。你可以从Github或者源代码官方网站下载。并上传至/usr/local/source_code/ 步骤2:下载完成后,需要将源代码解…...
竞赛选题 深度学习人体跌倒检测 -yolo 机器视觉 opencv python
0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满…...
使用gson将复杂的树型结构转Json遇到的问题,写入文件为空
某个项目需要用到一个较为复杂的数据结构。定义成一个树型链表。 public class TreeNode { private String name; public String getName() { return name; } public void setName(String name) { this.name name; } public String getPartType() { retur…...
JavaScript异步编程:提升性能与用户体验
目录 什么是异步编程? 回调函数 Promise Async/Await 总结 在Web开发中,处理耗时操作是一项重要的任务。如果我们在执行这些操作时阻塞了主线程,会导致页面失去响应,用户体验下降。JavaScript异步编程则可以解决这个问题&…...
lossBN
still tips for learning classification and regression关于softmax的引入和作用分类问题损失函数 - MSE & Cross-entropy⭐Batch Normalization(BN)⭐想法:直接改error surface的landscape,把山铲平feature normalization那…...
【微信小程序】数字化会议OA系统之投票模块(附源码)
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《微信小程序开发实战》。🎯Ἲ…...
clang-前端插件-给各种无花括号的“块”加花括号-基于llvm15--clang-plugin-add-brace
处理的语句 case 术语约定或备忘 case起止范围: 从冒号到下一个’case’开头, 简称有: case内 、case内容Ast: Abstract syntax tree: 抽象语法树没插入花括号的case 若case内, 以下任一条成立,则 跳过该case 即 不会对该case内容用花括号包裹. 有#define、有#include、有…...
python爬虫-某政府网站加速乐(简单版)实例小记
# -*- coding:utf-8 -*- # Time : 2023/10/23 17:06 # Author: 水兵没月 # File : 哈哈哈哈.py # Software: PyCharm ####################import random import requests# 代理 def get_proxy(proxy_typerandom.choice([1,2,3,4,5])):url "http://ZZZZZZZZZZZZZZZZZZ&qu…...
stable diffusion简介和原理
Stable Diffusion中文的意思是稳定扩散,本质上是基于AI的图像扩散生成模型。 Stable Diffusion是一个引人注目的深度学习模型,它使用潜在扩散过程来生成图像,允许模型在生成图像时考虑到文本的描述。这个模型的出现引起了广泛的关注和讨论&am…...
【机器学习】模型平移不变性/等变性归纳偏置Attention机制
Alphafold2具有旋转不变性吗——从图像识别到蛋白结构预测的旋转对称性实现 通过Alphafold2如何预测蛋白质结构,看有哪些机制或tricks可以利用? 一、等变Transformer 等变Transformer是Transformer众多变体的其中一种,其强调等变性。不变性…...
c++的4中类型转换操作符(static_cast,reinterpret_cast,dynamic_cast,const_cast),RTTI
目录 引入 介绍 static_cast 介绍 使用 reinterpret_cast 介绍 使用 const_cast 介绍 使用 dynamic_cast 介绍 使用 RTTI(运行时确定类型) 介绍 typeid运算符 dynamic_cast运算符 type_info类 引入 原本在c中,我们就已经接触到了很多类型转换 -- 隐式类型转…...
CNN实现与训练--------------以cifar10数据集为例进行演示(基于Tensorflow)
本文以cifar10数据集为例进行演示 (cifar10数据集有5万张3232像素点的彩色图片,用于训练有1万张3232像素点的彩色图片,用于测试) import tensorflow as tf import os import numpy as np from matplotlib import pyplot as plt from tensorflow.keras.layers import Conv2…...
YOLOv5算法改进(21)— 添加CA注意力机制 + 更换Neck网络之BiFPN + 更换损失函数之EIoU
前言:Hello大家好,我是小哥谈。通过上节课的学习,相信同学们一定了解了组合改进的核心。本节课开始,就让我们结合论文来对YOLOv5进行组合改进(添加CA注意力机制+更换Neck网络之BiFPN+更换损失函数之EIoU),希望同学们学完本节课可以有所启迪,并且后期可以自行进行YOLOv5…...
面对6G时代 适合通信专业的 毕业设计题目
对于通信专业的本科生来说,选择一个与学习内容紧密相关的毕业设计题目十分重要。 以下是东枫科技建议的题目,它们涵盖了通信技术的不同方面: 高校老师可以申请东枫科技工程师共同对学生指导,完成毕业设计。 基于5G/6G的通信技术…...
使用Python实现一个简单的斗地主发牌
使用Python实现一个简单的斗地主发牌 1.源代码实现2.实现效果 1.源代码实现 import random# 定义扑克牌的花色和大小 suits [♠, ♥, ♣, ♦] ranks [2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A]# 初始化一副扑克牌 deck [suit rank for suit in suits for rank in ranks]# …...
Linux系统之file命令的基本使用
Linux系统之file命令的基本使用 一、file命令介绍1.1 Linux简介1.2 file命令简介 二、file命令的使用帮助2.1 file命令的help帮助信息2.2 file命令的语法解释2.3 file命令的man手册 三、文件类型介绍四、file命令的基本使用4.1 查询file版本4.2 显示文件类型4.3 输出时不显示文…...
【智能大数据分析】实验1 MapReduce实验:单词计数
【智能大数据分析】实验1 MapReduce实验:单词计数 文章目录 【智能大数据分析】实验1 MapReduce实验:单词计数一、实验目的二、实验要求三、实验原理1 MapReduce编程2 Java API解析 四、实验步骤1 启动Hadoop2 验证HDFS上没有wordcount的文件夹3 上传数据…...
KV STUDIO的安装与实践(一)
目录 什么是KV STUDIO? 如何安装KV STUDIO? 如何学习与使用KV STUDIO(在现实中的应用)? 应用一(在现实生活中机器内部plc的读取与替换) 读取 KV STUDIO实现显示器的检测!&#…...
matlab simulink ADRC控制样例
1、内容简介 略 3-可以交流、咨询、答疑 2、内容说明 用adrc控制传递函数,保证输出达到预期 ADRC控制器、传递函数 3、仿真分析 4、参考论文 略...
我是如何走上测试管理岗的
最近有小伙伴问了一个问题:他所在的测试团队规模比较大,有 50 多个人,分成了 4 ~ 5 个小组。这位同学觉得自己的技术能力在团队里应该属于比较不错的,但疑惑的是在几次组织架构调整中,直属领导一直没有让他来管理一个小…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
