当前位置: 首页 > news >正文

XML文件读写

0、.pro文件添加依赖


QT       += xml

1、使用 QDomDocument 方式


#include <QtXml/QDomDocument>
#include <QtXml/QDomProcessingInstruction>
#include <QtXml/QDomElement>
#include <QFile>
#include <QTextStream>
#include <QDebug>bool Widget::WriteXmlFile(const QString fileName)
{//创建QDomDocument对象QDomDocument xDoc;QDomProcessingInstruction inStruction;//写入xml文件头(xml版本信息和编码信息)inStruction = xDoc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");xDoc.appendChild(inStruction);//创建根节点并将其添加到xDoc中QDomElement root = xDoc.createElement("root");xDoc.appendChild(root);//创建子节点1QDomElement childNode1 = xDoc.createElement("childNode1");//为子节点childNode1设置属性及属性值childNode1.setAttribute("AttributeKey", "AttributeValue");//! 为子节点childNode1添加节点值//! 创建QDomText对象并设置其值QDomText nodeVal = xDoc.createTextNode("childNode1 Value");//使用QDomElement对象的节点,添加节点值需添加QDomText对象,否则有可能不显示该值childNode1.appendChild(nodeVal);//将子节点1添加到根节点中root.appendChild(childNode1);//! 创建一个多级节点childNode2//创建多级节点2QDomElement childNode2 = xDoc.createElement("childNode2");//为多级节点childNode2设置属性及属性值childNode2.setAttribute("AttributeKey", "AttributeValue");//创建多级节点的子节点1QDomElement cChildNode1 = xDoc.createElement("childNode2_1");//设置cChildNode1的属性和值cChildNode1.setAttribute("ww", 1);//设置cChildNode1的节点值cChildNode1.appendChild(xDoc.createTextNode("childNode2_1 Value"));//将cChildNode1节点添加到多级节点中childNode2.appendChild(cChildNode1);//创建多级节点的子节点2QDomElement cChildNode2 = xDoc.createElement("childNode2_2");//设置cChildNode2的属性和值cChildNode2.setAttribute("mm", 2);//设置cChildNode2的节点值cChildNode2.appendChild(xDoc.createTextNode("childNode2_2 Value"));//将cChildNode2节点添加到多级节点中childNode2.appendChild(cChildNode2);//将多级节点childNode2添加到根节点中root.appendChild(childNode2);//指定xml文件路径QFile file("./test.xml");//以只读方式打开,并且会清空文件内容if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)){return false;}//使用文本流写入文件QTextStream outputStream(&file);xDoc.save(outputStream, 4); //缩进四格file.close();return true;
}
bool Widget::ReadXmlFile(const QString fileName)
{//创建QDomDocument对象QDomDocument xDoc;//指定读取的xml文件路径QFile file("./test.xml");//xml文件以只读方式打卡if (!file.open(QIODevice::ReadOnly)){return false;}//调用setContent函数设置数据源if (!xDoc.setContent(&file)) {file.close();return false;}file.close();//获取xDoc中的QDomElement对象QDomElement docElem = xDoc.documentElement();//获取docElem的根节点QDomNode node = docElem.firstChild();//!获取第一个子节点,并读取其属性及其值QDomElement  childNode1 = node.toElement();//获取childNode1的属性值QString attri1 = childNode1.attribute("AttributeKey");//获取childNode1的节点值(既然设置节点值需要插入子节点,那么读取也应读取其子节点)QDomNode node1Child = childNode1.firstChild();QString node1Val = node1Child.nodeValue();//输出属性值和节点值qDebug() << "子节点1的属性值: " << attri1;qDebug() << "子节点1的节点值: " << node1Val;//将节点移至下一节点的位置node = node.nextSibling();//! 获取第二个节点,并使用循环获取其中的各值QDomElement  childNode2 = node.toElement();//获取childNode1的属性值QString attri2 = childNode2.attribute("AttributeKey");qDebug() << "子节点2的属性值: " << attri2;//获取第二节点中的第一子节点QDomNode childNode2_ = childNode2.firstChild();while(!childNode2_.isNull()) {//获取当前子节点的对象QDomElement e = childNode2_.toElement();if(!e.isNull()) {qDebug() << "子节点2的节点值: " << e.firstChild().nodeValue(); }//获取下一节点元素childNode2_ = childNode2_.nextSibling();}return true;
}

2、使用 QXmlStreamReader 方式


#include <QFile>
#include <QTextStream>
#include <QDebug>
#include <QXmlStreamReader>bool Widget::ReadXmlFile2(const QString fileName/* = ""*/)
{{QString str;QFile file("./text.xml");if(!file.open(QFile::ReadOnly|QFile::Text)){qDebug() << "Failed to open file";  //文件打开失败return false;}QXmlStreamReader reader(&file);QXmlStreamReader::TokenType mtype = reader.readNext(); //读取下一个记号,并返回类型if (QXmlStreamReader::StartDocument == mtype){qDebug()<<"版本:"<<reader.documentVersion()<<"编码:"<<reader.documentEncoding();}while(!reader.atEnd()){if(reader.isStartElement()){QString STR = reader.name().toString();if(reader.name() == "info"){QXmlStreamAttributes attributes = reader.attributes(); //获取元素的属性if (attributes.hasAttribute("id")){qDebug() << attributes.value("id");	//返回值是QStringRef,可以通过toString()转换成QString类型}if (attributes.hasAttribute("date")){qDebug() << attributes.value("date");}}else if (reader.name() == "name"){str = reader.readElementText();qDebug() << str;}else if(reader.name() == "age"){str = reader.readElementText();qDebug() << str << endl;}}else if (reader.isEndElement()){if(reader.name() == "info"){qDebug()<<endl;}}mtype = reader.readNext();}file.close();}return true;
}bool Widget::WriteXmlFile2(const QString fileName/* = ""*/)
{{QString name[]={"name1","name2","name3","name4"};QString date[]={"20230101","20230201","20230301","20230401"};QFile file("./text.xml");if(!file.open(QFile::WriteOnly|QFile::Text)){qDebug()<< "file cannot open";return false;}QXmlStreamWriter stream(&file);stream.setAutoFormatting(true);		//自动化格式,提高可读性//这里可以分别设置编码、版本1.0。或者直接调用writeStartDocument()默认生成//stream.setCodec("gb2312");				// 设置encoding="gb2312"//stream.writeStartDocument("1.0", true);	// 开始文档(XML 声明)stream.writeStartDocument();				// 默认: <?xml version="1.0" encoding="UTF-8"?>stream.writeStartElement("root");for (int i = 0; i < 4; i++){stream.writeStartElement("info");stream.writeAttribute("id", QString::number(i+1));stream.writeAttribute("date", date[i]);stream.writeTextElement("name",name[i]);stream.writeTextElement("age","20");stream.writeEndElement();}stream.writeEndElement();stream.writeEndDocument();file.close();}return true;
}

相关文章:

XML文件读写

0、.pro文件添加依赖 QT xml1、使用 QDomDocument 方式 #include <QtXml/QDomDocument> #include <QtXml/QDomProcessingInstruction> #include <QtXml/QDomElement> #include <QFile> #include <QTextStream> #include <QDebug>bo…...

Win11 安装 Vim

安装包&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Ru7HhTSotz9mteHug-Yhpw?pwd6666 提取码&#xff1a;6666 双击安装包&#xff0c;一直下一步。 配置环境变量&#xff1a; 先配置系统变量中的path&#xff1a; 接着配置用户变量&#xff1a; 在 cmd 中输入…...

Mac电脑BIM建模软件 Archicad 26 for Mac最新

ARCHICAD 软件特色 智能化 在2D CAD中&#xff0c;所有的建筑构件都由线条构成和表现&#xff0c;仅仅是一些线条的组合而已&#xff0c;当我们阅读图纸的时候是按照制图规范来读取这些信息。我们用一组线条表示平面中的窗&#xff0c;再用另一组不同的线条在立面中表示同一个…...

JavaEE-网络编程套接字(UDP/TCP)

下面写一个简单的UDP客户端服务器流程 思路&#xff1a; 对于服务器端&#xff1a;读取请求&#xff0c;并解析–> 根据解析出的请求&#xff0c;做出响应(这里是一个回显&#xff0c;)–>把响应写回客户端 对于客户端&#xff1a;从控制台读取用户输入的内容–>从控制…...

微服务技术栈-Gateway服务网关

文章目录 前言一、为什么需要网关二、Spring Cloud Gateway三、断言工厂和过滤器1.断言工厂2.过滤器3.全局过滤器4.过滤器执行顺序 四、跨域问题总结 前言 在之前的文章中我们已经介绍了微服务技术中eureka、nacos、ribbon、Feign这几个组件&#xff0c;接下来将介绍另外一个组…...

函数形状有几种定义方式;操作符infer的作用

在 TypeScript 中&#xff0c;函数形状可以用多种方式进行定义。下面介绍了几种常用的函数形状定义方式&#xff1a; 函数声明&#xff1a; function add(a: number, b: number): number {return a b; }在函数声明中&#xff0c;我们直接使用 function 关键字来声明函数&…...

Java / MybatisPlus:JSON处理器的应用,在实体对象中设置对象属性,对象嵌套对象

1、数据库设计 2、定义内部的实体类 /*** Author lgz* Description* Date 2023/9/30.*/ Data // 静态构造staticName&#xff0c;方便构造对象并赋予属性 AllArgsConstructor(staticName "of") NoArgsConstructor ApiModel(value "亲友", description …...

力扣 -- 1027. 最长等差数列

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int longestArithSeqLength(vector<int>& nums) {int nnums.size();int ret2;unordered_map<int,int> hash;//这里可以先把nums[0]存进哈希表中&#xff0c;方便后面i从1开始遍历hash[num…...

正则验证用户名和跨域postmessage

正则验证用户名 字母数字符号大小写8-14匹配用户名的 <!DOCTYPE html> <html> <head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1"><title>form</title> …...

jsbridge实战1:xcode swift 构建iOS app

[[toc]] 环境安装 macOs: 10.15.5 xcode: 11.6 demo:app 创建 hello world iOS app 创建工程步骤 选择&#xff1a;Create a new Xcode project选择&#xff1a;iOS-> single View App填写&#xff1a; project name: swift-app-helloidentifer: smile 包名language: s…...

零基础部署nginx mysql springboot

参考&#xff1a;写给开发人员看的Docker干货&#xff0c;零基础部署nginx mysql springboot 一、连接linux 阿里云 参考&#xff1a;部署到Linux 可能需要购买&#xff1a;购买链接 二、安装docker # 先切换到root用户下 sudo su# 更新apt-get&#xff0c;保证apt-get最新…...

6-3 模式匹配

description 给出主串s和模式串t&#xff0c;其长度均不超过1000。本题要求实现一个函数BF(string s, string t)&#xff0c;求出模式串t在主串s中第一次出现的位置&#xff08;从0开始计算&#xff09;&#xff0c;如果在s中找不到t&#xff0c;则输出-1。 函数接口定义&…...

SQL JOIN 时 USING 和 ON 的异同

在数据表做 join 时&#xff0c;即可以用 using&#xff0c;也可以用 on。有什么异同点呢。 ON 是更加普遍的用法&#xff0c;可以连接表 On 一个字段&#xff0c;多个字段&#xff0c;甚至一个条件表达式。举例 SELECT * FROM world.City JOIN world.Country ON (City.Cou…...

安全学习_开发相关_JNDI介绍(注入)RMILDAP服务

文章目录 参考&本节目的JNDI概念-RMI&LDAP服务调用检索&#xff1a;在RMI服务中调用了InitialContext.lookup()的常用类有&#xff1a;在LDAP服务中调用了InitialContext.lookup()的常用类有&#xff1a; JNDI注入-使用工具生成远程调用JNDI远程调用-工具&#xff08;j…...

C#学生选课及成绩查询系统

一、项目背景 学生选课及成绩查询系统是一个学校不可缺少的部分&#xff0c;传统的人工管理档案的方式存在着很多的缺点&#xff0c;如&#xff1a;效率低、保密性差等&#xff0c;所以开发一套综合教务系统管理软件很有必要&#xff0c;它应该具有传统的手工管理所无法比拟的…...

【C语言】利用数组处理批量数据(一维数组和二维数组)

前言:在前面学习的程序中使用的变量都属于基本类型&#xff0c;例如整型、字符型、浮点型数据&#xff0c;这些都是简单的数据类型。对于简单的问题&#xff0c;使用这些简单的数据类型就可以了。但是对于有些需要处理的数据&#xff0c;只用以上简单的数据类型是不够的&#x…...

WPF中, 如何将控件的触发事件绑定到ViewModel

在DataGrid 等控件中, 有很多这种带闪电符号的触发事件. 如果用传统的事件驱动, 则直接在后台中建立 一个private PropertyChanged(Sender s, EventAgars Args) 即可. 但是如果需要绑定到ViewModel的话? 应该怎么做? 带闪电符号的触发事件 实现viewModel绑定前端触发事件的…...

解决Qt msvc编译器 中文显示乱码问题

第一步&#xff1a;代码文件选择用utf8编码带bom。第二步&#xff1a;在有中文汉字的代码文件顶部加一行&#xff08;一般是cpp文件&#xff09; #pragma execution_character_set(“utf-8”) 可以考虑放在head.h中&#xff0c;然后需要的地方就引入head头文件就行&#xff0c;…...

JAVA面经整理(7)

一)什么是AQS&#xff1f; 1)AQS也被称之为是抽象同步队列&#xff0c;它是JUC包底下的多个组件的底层实现&#xff0c;Lock&#xff0c;CountDownLatch和Semphore底层都使用到了AQS AQS的核心思想就是给予一个等待队列和同步状态来实现的&#xff0c;它的内部使用一个先进先出…...

CentOS7使用技巧

1、防火墙相关 关闭防火墙 systemctl stop firewalld 关闭防火墙开机自启 systemctl disable firewalld.service 查看防火墙状态 systemctl status firewalld...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...