C++,Qt分别读写xml文件
XML语法
第一行是XML文档声明,<>内的代表是元素,基本语法如以下所示。C++常见的是使用tiny库读写,Qt使用自带的库读写;
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<根元素><元素 属性名="属性值" 属性名="属性值">Text</元素><元素 属性名="属性值" 属性名="属性值"><子元素>Text</子元素></元素>
</根元素>
C++使用tinyxml读写xml
首先从网站下载tinyxml库,
将6个文件加载到自己的项目中:
写XML:
新建文件并写入:
#include "include/tinyxml.h"string strPath = "E:/test.xml";
TiXmlDocument *writeDoc = new TiXmlDocument; //xml文档指针
//文档格式声明
TiXmlDeclaration *decl = new TiXmlDeclaration("1.0", "UTF-8", "yes");
writeDoc->LinkEndChild(decl); //写入文档
//TiXmlElement父类的析构函数内自带delete,所以不用自己释放
TiXmlElement *RootElement = new TiXmlElement("Camera");//根元素
RootElement->SetAttribute("num", "3"); //属性
writeDoc->LinkEndChild(RootElement);
TiXmlElement *StuElement = new TiXmlElement("Exposure");//Stu
//设置属性
StuElement->SetAttribute("time", "A");
StuElement->SetAttribute("deley", "30");
RootElement->LinkEndChild(StuElement);//父节点写入文档
//子元素
TiXmlElement *sonElement1 = new TiXmlElement("max");
StuElement->LinkEndChild(sonElement1);
TiXmlText *maxContent = new TiXmlText("1000");
sonElement1->LinkEndChild(maxContent);TiXmlElement *sonElement2 = new TiXmlElement("min");
StuElement->LinkEndChild(sonElement2);
TiXmlText *minContent = new TiXmlText("80");
sonElement2->LinkEndChild(minContent);writeDoc->SaveFile(strPath.c_str());
delete writeDoc;
最终生成的xml文件是:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Camera num="3"><Exposure time="A" deley="30"><max>1000</max><min>80</min></Exposure>
</Camera>
所以,使用tinyxml函数库中的类去读写根元素,text和属性。这里主要用到的就是四个类和三个函数:
<TiXmlDeclaration>
<TiXmlElement><TiXmlElement><TiXmlElement>TiXmlText</TiXmlElement></TiXmlElement>
</TiXmlElement>
四个类:
TiXmlDocument:定义一些基本的xml文件的基本操作,包含文件流;
TiXmlDeclaration:用于xml文件的第一行,定义xml文件的声明操作;
TiXmlElement:不管根元素,元素和子元素,都用此类;
TiXmlText:用于元素内的text的操作;
三个函数:
LinkEndChild:将子元素嵌在父元素内,还可以将text加到元素内
SetAttribute:设置元素内的属性名称与属性值
SaveFile:用于保存xml文件;如果xml文件不存在,会自动创建一个;
读XML:
TiXmlDocument mydoc("E:/test.xml");
if(!mydoc.LoadFile())
{return;
}
TiXmlElement *RootElement = mydoc.RootElement(); //获取根元素
//遍历根元素下的元素
for(TiXmlElement *StuElement = RootElement->FirstChildElement();//第一个子元素StuElement != NULL;StuElement = StuElement->NextSiblingElement())//下一个兄弟元素
{//先找到Exposure元素if (0 == strcmp("Exposure", StuElement->Value())){//遍历Exposure元素下的子元素for (TiXmlElement *sonElement = StuElement->FirstChildElement();sonElement != NULL;sonElement = sonElement->NextSiblingElement()){//找到max元素,并输出元素内的textif (0 == strcmp("max", sonElement->Value())){string str = sonElement->GetText();cout << str.c_str() << endl;}}}
}
Qt读写xml
写XML:
//头文件
#include <QDomDocument>
QString fileName = "E:/test.xml";
QFile file(fileName);
if(!file.open(QIODevice::WriteOnly|QIODevice::Truncate))return;
//定义xml文件
QDomDocument doc;
//定义格式头
QDomProcessingInstruction ins = doc.createProcessingInstruction("xml","version = \'1.0\' encoding = \'utf-8\'");
//追加元素
doc.appendChild(ins);
//根节点元素
QDomElement root = doc.createElement("Camera");
doc.appendChild(root);
//在根节点的基础上增加一个子节点
QDomElement sonEmt = doc.createElement("Exposure");
//创建元素的属性名
QDomAttr sonAttr = doc.createAttribute("time");
//创建元素的属性值
sonAttr.setNodeValue("100");
//节点和属性关联
sonEmt.setAttributeNode(sonAttr);
root.appendChild(sonEmt);
//在根节点的基础上增加一个子节点,并设置子节点的text
QDomElement sonOneEmt = doc.createElement("max");
QDomText sonOneText = doc.createTextNode("1000");
sonOneEmt.appendChild(sonOneText);
sonEmt.appendChild(sonOneEmt);QDomElement sonTwoEmt = doc.createElement("min");
QDomText sonTwoText = doc.createTextNode("80");
sonTwoEmt.appendChild(sonTwoText);
sonEmt.appendChild(sonTwoEmt);//写入文件
QTextStream stream(&file);
doc.save(stream,4);//4缩进
这里对应的类有:
<QDomProcessingInstruction>
<QDomElement><QDomElement>QDomText</QDomElement><QDomElement QDomAttr></QDomElement>
</QDomElement>
读XML:
#include <QXmlStreamReader>QDomDocument doc;
QString fileName = "E:/test.xml";
QFile file(fileName);
if(!file.open(QIODevice::ReadOnly|QIODevice::Truncate))
{return;
}
else
{//将文件内容读到doc中if(!doc.setContent(&file))file.close();//返回根元素QDomElement root = doc.documentElement();//返回根元素的名称QDomNode n = root.firstChild();while(!n.isNull()){if(n.isElement()){QDomElement e = n.toElement();QString strXML = qPrintable(e.tagName());//判断第一个节点if("Exposure" == strXML){//遍历寻找Exposure元素下的子元素,并找到其textQDomNodeList list = e.childNodes();for(int i=0;i<list.count();i++){QDomNode node = list.at(i);strXML = qPrintable(node.toElement().tagName());//判断第二个元素if(node.isElement() && "max"== strXML)QString textStr = qPrintable(node.toElement().text());//读取子元素内的text}}}}
}
界面读取的效果为:
相关文章:

C++,Qt分别读写xml文件
XML语法 第一行是XML文档声明,<>内的代表是元素,基本语法如以下所示。C常见的是使用tiny库读写,Qt使用自带的库读写; <?xml version"1.0" encoding"utf-8" standalone"yes" ?> <根元素>…...

WebStorm安装教程【2023年最新版图解】一文教会你安装
文章目录引言一、下载WebStorm三、WebStorm激活配置及创建项目Active Code安装完成尝试新建一个项目引言 今天发现了一个专注前端开发的软件,相比VSCode的话,这个好像也不错,为了后续做个API接口项目做准备。 对于入门JavaScript 开发的者&am…...

用户态和内核态,系统调用
特权指令:具有特殊权限的指令,比如清内存,重置时钟,分配系统资源,修改用户的访问权限 由于这类指令的权限最大,所以使用不当会导致整个系统崩溃 系统调用:是操作系统提供给应用程序的接口(供应…...

Java 包装类
Java 中有些类只能操作对象,因此 Java 的基本数据类型都有一个对应的包装类。 byte:Byteshort:Shortint:Integerlong:Longfloat:Floatdouble:Doublechar:Characterbooleanÿ…...

Raspberry Pi GPIO入门指南
如果您想使用 Raspberry Pi 进行数字输入/输出操作,那么您需要使用 GPIO(通用输入/输出)引脚。在这篇文章中,我们将为您提供 Raspberry Pi GPIO 的基础知识,包括如何访问和操作 GPIO 引脚。 0.认识GPIO 树莓派上的那…...

汇编语言程序设计(三)之汇编程序
系列文章 汇编语言程序设计(一) 汇编语言程序设计(二)之寄存器 汇编程序 经过上述课程的学习,我们可以编写一个完整的程序了。这章开始我们将开始编写完整的汇编语言程序,用编译和连接程序将它们连接成可…...

用二极管和电容过滤电源波动,实现简单的稳压 - 小水泵升压改装方案
简而言之,就是类似采样保持电路,当电源电压因为电机启动而骤降时,用二极管避免电容电压跟着降低,从而让电容上连接的低功耗芯片有一个比较稳定的供电电压。没什么特别的用处,省个LDO 吧,电压跌幅太大的时候…...

【数据结构与算法】数据结构有哪些?算法有哪些?
1. 算法与数据结构总览图 2.常用的数据结构 2.1.数组(Array) 数组是一种聚合数据类型,它是将具有相同类型的若干变量有序地组织在一起的集合。数组可以说是最基本的数据结构,在各种编程语言中都有对应。一个数组可以分解为多个数…...

使用Element-UI展示数据(动态查询)
学习内容来源:视频P4 本篇文章进度接着之前的文章进行续写 精简前后端分离项目搭建 Vue基础容器使用 目录选择组件修改表格组件修改分页组件增加后端接口前端请求数据接口页面初始化请求数据点击页码请求数据选择组件 在官方文档中选择现成的组件,放在页…...

lamda 表达式例子全集
1、List 转 map 1.1、key(Model属性) value Model Map<String, Model> modeMap List.stream().collect(Collectors.toMap(Model1::属性get方法, v -> v, (p1, p2) -> p1)); 1.2、key(Model1属性) value Model2 Map<String, Model1> model2Map List.stream…...

计算机网络第八版——第一章课后题答案(超详细)
第一章 该答案为博主在网络上整理,排版不易,希望大家多多点赞支持。后续将会持续更新(可以给博主点个关注~ 【1-01】计算机网络可以向用户提供哪些服务? 解答:这道题没有现成的标准答案,因为可以从不同的…...

嵌入式和Python(二):python初识及其基本使用规则
目录 一,python基本特点 二,python使用说明 ● 两种编程方式 ① 交互式编程 ② 脚本式编程 ● python中文编码 ● python行和缩进 ● python引号 ● python空行 ● python等待用户输入 ① 没有转换变量类型 ② 转换变量类型 ● python变…...

C语言详解双向链表的基本操作
目录 双链表的定义与接口函数 定义双链表 接口函数 详解接口函数的实现 创建新节点(BuyLTNode) 初始化双链表(ListInit) 双向链表打印(ListPrint) 双链表查找(ListFind) 双链…...

面试必须要知道的常见排序算法
以下排序均为升序 1.直接插入排序 具体思想 把待排序的数据按大小比较插入到一个已经排序好的有序序列中,直到所有的待排序数据全部插入到有序序列中为止.实际生活中,我们平常斗地主摸牌时,就用到了插入排序的思想. 当插入第n个数据时,前面n-1个数据已经有序;第n个数据依次与前…...

Kubernetes之服务发布
学了服务发现后,svc的IP只能被集群内部主机及pod才可以访问,要想集群外的主机也可以访问svc,就需要利用到服务发布。 NodePort Nodeport服务是外部访问服务的最基本方式。当我们创建一个服务的时候,把服务的端口映射到kubernete…...

【第二章】谭浩强C语言课后习题答案
1. 什么是算法?试从日常生活中找3个例子,描述它们的算法 算法:简而言之就是求解问题的步骤,对特定问题求解步骤的一种描述。 比如生活中的例子: 考大学首先填报志愿表、交报名费、拿到准考证、按时参加考试、收到录取通知书、按照日期到指定学校报到。 去北京听演唱会首先…...

PostgreSQL和PostGISWGS84和CGCS2000与GCJ02和BD09坐标系与之间互转
– 如果转换后结果为null,查看geom的srid是否为4326或者4490 WGS84转GCJ02 select geoc_wgs84togcj02(geom) from test_table GCJ02转WGS84 select geoc_gcj02towgs84(geom) from test_table WGS84转BD09 select geoc_wgs84tobd09(geom) from test_table BD09转WGS84 select …...

数据结构——链表讲解(2)
作者:几冬雪来 时间:2023年3月5日 内容:数据结构链表讲解 目录 前言: 剩余的链表应用: 1.查找: 2.改写数据: 3.在pos之前插入数据: 4.pos位置删除: 5.在pos的后…...

Elasticsearch:图片相似度搜索的 5 个技术组成部分
作者:Radovan Ondas,Bernhard Suhm 在本系列博文的第一部分中,我们介绍了图像相似度搜索,并回顾了一种可以降低复杂性并便于实施的高级架构。 此博客解释了实现图像相似性搜索应用程序所需的每个组件的基本概念和技术注意事项。 学…...

【CVPR2022】Class Re-Activation Maps for Weakly-Supervised Semantic Segmentation
论文标题:Class Re-Activation Maps for Weakly-Supervised Semantic Segmentation收录:CVPR 2022paper: https://arxiv.org/abs/2203.00962code: https://github.com/zhaozhengChen/ReCAM解读:https://zhuanlan.zhihu.com/p/478133151https:…...

PMP项目管理项目运行环境
目录1 概述2 事业环境因素和组织过程资产3 组织系统3.1 概述3.2 组织治理框架3.2.1 治理框架3.2.2 项目治理3.3 管理要素3.4 组织结构类型3.4.1 组织结构类型3.4.2 项目管理办公室1 概述 项目所处的环境可能对项目的开展产生有利或不利的影响,这些影响的两大主要来…...

Vue 3.0 渲染函数 【Vue3 从零开始】
Vue 推荐在绝大多数情况下使用模板来创建你的 HTML。然而在一些场景中,你真的需要 JavaScript 的完全编程的能力。这时你可以用渲染函数,它比模板更接近编译器。 让我们深入一个简单的例子,这个例子里 render 函数很实用。假设我们要生成一些…...

西电软件体系结构核心考点汇总(期末真题+核心考点)
文章目录前言一、历年真题二、核心考点汇总2.1 什么是软件体系架构?(软件体系结构的定义)2.2 架构风格优缺点2.3 质量属性2.4 质量评估前言 主要针对西安电子科技大学《软件体系结构》的核心考点进行汇总。 【期末期间总结资料如下】 针对西电计科院软件工程专业大三《软件体…...

SRS源码分析-SDP内容解析
前言 在学习SRS的RTC模块之前,首先来分析下SRS在将rtmp推流转成rtc流,通过浏览器拉取webrtc流场景下产生的SDP内容 SDP格式介绍 SDP数据是文本格式,由多个 <key><value> 表达式构成,<key>的值只能是一个字符…...

HTML 颜色
HTML 颜色 HTML 颜色采用的是 RGB 颜色,是通过对红 (R)、绿 (G)、蓝 (B) 三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB 即是代表红、绿、蓝三个通道的颜色。 Color Values HTML 颜色由一个十六进制符号来定义,这个符…...

MySQL高可用架构之InnoDB Cluster部署
MySQL高可用架构之InnoDB Cluster部署InnoDB Cluster适用场景准备工作安装MySQL Shell使用MySQL Shell搭建InnoDB Cluster初始化第一个实例创建InnoDB Cluster添加副本实例创建相关用户MySQL Router部署安装MySQL Router引导MySQL Router启动MySQL Router环境准备 主机名IPOS版…...

Linux安装minio单机版
说明:因为前面记录了一下minio的使用,这里说一下minio的安装,只是单机版哦 环境准备:Linux系统 说明图: 1.创建文件夹命令 我的是安装在/usr/local 文件夹下面的创建文件夹命令 #进入目标文件夹 cd /usr/local#创建…...

网络总结知识点(网络工程师必备)四
♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放,树高千尺,落叶归根人生不易,人间真情 目录 前言 71.NAPT有什么特点? 72.ARP欺骗解决方法...

数据结构——第三章 栈与队列(5)
共用栈和双队列1.共用栈2.双端队列栈与队列的本章小节1.共用栈 在实际应用中,有时一个应用程序需要多个栈,但这些栈的数据元素类型相同。假设每个栈都采用顺序栈,由于每个栈的使用情况不尽相同,势必会造成存储空间的浪费。若让多…...

CSDN竞赛第33期题解
CSDN竞赛第33期题解 1、题目名称:奇偶排序 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。(奇数和偶数的顺序根据输入的数字顺序排 列) #include<bits/stdc.h> using namespace std; t…...