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

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...