当前位置: 首页 > 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...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...