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

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

Canal环境搭建并实现和ES数据同步

作者&#xff1a;田超凡 日期&#xff1a;2025年6月7日 Canal安装&#xff0c;启动端口11111、8082&#xff1a; 安装canal-deployer服务端&#xff1a; https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...