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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/95090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker Compose安装

title: “Docker Compose安装” createTime: 2022-01-04T19:08:1508:00 updateTime: 2022-01-04T19:08:1508:00 draft: false author: “name” tags: [“docker”,“docker-compose”] categories: [“install”] description: “测试的” docker-compose安装步骤 1.下载 u…

数据结构-优先级队列(堆)

文章目录 目录 文章目录 前言 一 . 堆 二 . 堆的创建(以大根堆为例) 堆的向下调整(重难点) 堆的创建 堆的删除 向上调整 堆的插入 三 . 优先级队列 总结 前言 大家好,今天给大家讲解一下堆这个数据结构和它的实现 - 优先级队列 一 . 堆 堆&#xff08;Heap&#xff0…

C语言—位运算符

目录 &&#xff08;位与&#xff0c;AND&#xff09;&#xff1a; |&#xff08;位或&#xff0c;OR&#xff09;&#xff1a; 位取反(~)&#xff1a; 左移(<<)&#xff1a; 右移(>>)&#xff1a; &&#xff08;位与&#xff0c;AND&#xff09;&…

如何使用 Media.io 生成不同年龄的照片

Media.io 是一个在线图片编辑器&#xff0c;提供多种功能&#xff0c;包括照片滤镜、图像裁剪和图像转换。其中&#xff0c;Media.io 的 AI 年龄转换功能可以根据上传的照片&#xff0c;生成不同年龄的照片。 使用 Media.io 生成不同年龄的照片 要使用 Media.io 生成不同年龄…

【word】从正文开始设置页码

在写报告的时候&#xff0c;会要求有封面和目录&#xff0c;各占一页。正文从第3页开始&#xff0c;页码从正文开始设置 word是新建的 分出三节&#xff08;封面、目录、正文&#xff09; 布局--->分割符--->分节符--->下一页 这样就能将word分为3节&#xff0c;分…

Python操作MongoDb创建文档及CRUD基本操作

Python3中类的高级语法及实战 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python3数据科学包系列(一):数据分析实战 Python3数据科学包系列(二):数据分析实战 Python3数据科学包系列(三):数据分析实战 MongoDB 操作手册----文档…

1797_GNU pdf阅读器evince

全部学习汇总&#xff1a; GreyZhang/g_GNU: After some years I found that I do need some free air, so dive into GNU again! (github.com) 近段时间经历了很多事情&#xff0c;终于想找一点技术上的自由气氛。或许&#xff0c;没有什么比GNU的一些软件探索更适合填充这样的…

堆--堆排序

算法描述 heapify 建立大顶堆 将堆顶与堆底交换&#xff08;最大元素被交换到堆底&#xff09;&#xff0c;缩小并下潜调整堆 重复第二步直至堆里剩一个元素 可以使用之前课堂例题的大顶堆&#xff08;堆的初步认识-CSDN博客&#xff09;来实现 MaxHeap方法&#xff1a; /…

电机-电力拖动-振动-应力分析-设备防护知识初步

1.涉及领域和课程&#xff1a; 信号与系统现代自动化原理与应用频谱转换及振动分析材料学基础与应力分析数学建模、仿真与求解工程数学传感器机器学习与模式识别随机信号处理反馈系统文献学DSP应用机器视觉凸优化&#xff0c;数学物理方法 2.教材推荐 豆瓣书单&#xff0c;更…

如何在终端输出颜色

效果演示: 【看 welcome to here 部分】 环境&#xff1a; Node.js 18.16.0 正文部分 我们可以通过 console.log() 在终端打印字符串。 只要在我们的字符串前面加上转义字符即可。 差不多就是下面这样的结构&#xff1a; 用代码就是&#xff1a; console.log("\x1B…

协议栈——收发数据(拼接网络包,自动重发,滑动窗口机制)

目录 协议栈何时发送数据&#xff5e; 数据长度 IP模块的分片功能 发送频率 网络包序号&#xff5e;利用syn拼接网络包ack确认网络包完整 确定偏移量 服务器ack确定收到数据总长度 序号作用 双端告知各自序号 协议栈自动重发机制 大致流程 ack等待时间如何调整 是…

java做个qq机器人

前置的条件 机器人是基于mirai框架实现的。根据官方的文档&#xff0c;建议使用openjdk11。 我这里使用的编辑工具是idea2023 在idea中新建一个maven项目&#xff0c;虽然可以使用gradle进行构建&#xff0c;不过我这里由于网络问题没有跑通。 pom.xml <dependency>&l…

2023年CSP-J真题详解+分析数据

目录 亲身体验 江苏卷 选择题 阅读程序题 阅读程序(1&#xff09; 判断题 单选题 阅读程序(2) 判断题 单选题 阅读程序(3) 判断题 单选题 完善程序题 完善程序(1) 完善程序(2) 2023CSP-J江苏卷详解 小结 亲身体验 2023年的CSP-J是在9月16日9:30--11:30进行…

竞赛选题 深度学习 opencv python 公式识别(图像识别 机器视觉)

文章目录 0 前言1 课题说明2 效果展示3 具体实现4 关键代码实现5 算法综合效果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的数学公式识别算法实现 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学…

【实用工具】谷歌浏览器插件开发指南

谷歌浏览器插件开发指南涉及以下几个方面&#xff1a; 1. 开发环境准备&#xff1a;首先需要安装Chrome浏览器和开发者工具。进入Chrome应用商店&#xff0c;搜索“Extensions Reloader”和“Manifest Viewer”两个插件进行安装&#xff0c;这两个插件可以方便开发和调试。 2…

国庆作业day6

服务器 #include <my_head.h> #define IP "192.168.101.66" #define PORT 6666 int main(int argc, const char *argv[]) {//创建套接字int fd socket(AF_INET, SOCK_STREAM, 0);if(fd < 0){ERR_MSG("socket");return -1;}struct sockaddr_in s…

Win11 安装 Vim

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

图的广度遍历-邻接矩阵实现

description 本题要求实现邻接矩阵存储图的广度优先遍历。 函数接口定义&#xff1a; void BFS(MGraph G,Vertex i); 其中MGraph是邻接矩阵存储的图&#xff0c;定义如下&#xff1a; #define MaxVertexNum 10 /定义最大顶点数/ typedef int Vertex;/* 用顶点下标表示顶点,…

RabbitMQ 5种工作模式介绍和Springboot具体实现

RabbitMQ有5中工作模式&#xff1a;简单模式、工作队列模式、发布/订阅模式、路由模式和主题模式 简单模式&#xff08;Simple Mode&#xff09; 简单模式是最基本的工作模式&#xff0c;也是最简单的模式。在简单模式中&#xff0c;生产者将消息发送到一个队列中&#xff0c;…

这可能是最全的反爬虫及应对方案,再也不怕爬不到数据了

一、什么是反爬虫 网络爬虫&#xff0c;是一个自动提取网页的程序&#xff0c;它为搜索引擎从万维网上下载网页&#xff0c;是搜索引擎的重要组成。但是当网络爬虫被滥用后&#xff0c;互联网上就出现太多同质的东西&#xff0c;原创得不到保护。于是&#xff0c;很多网站开始…