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

Qt读写XML文档

XML 结构与概念简介

XML(可扩展标记语言) 是一种用于存储和传输结构化数据的标记语言。其核心特性包括:

1、树状结构:XML 数据以层次化的树形结构组织,包含一个根元素(Root Element),其他元素作为其子节点。
2、标签(Tag):通过开始标签(如 )和结束标签(如 )定义元素,标签名区分大小写。
3、属性(Attribute):附加在标签上的键值对,如 。
4、文本内容:元素之间的纯文本,如 Qt5 Cadaques
5、注释与声明:以 标记注释,以 <?xml version="1.0" encoding="UTF-8"?> 开头声明版本和编码。

Qt 读写 XML 示例

<?xml version='1.0' encoding='UTF-8'?>
<books><book id="1"><title>Qt5 Cadaques</title><author>Jake Petroules</author><price>29.99</price></book><book id="2"><title>C++ Primer</title><author>Stanley B. Lippman</author><price>39.99</price></book><mybook id="3" title="C# forever"/><book id="4"><title>Effective Modern C++</title><author>Scott Meyers</author><price>49.99</price></book>
</books>

在Qt中读写XML文档常用的两种方式:

1、基于DOM(文档对象模型),核心类为QDomDocument

优点:
易于操作:支持XPath查询,便于遍历和修改节点。
完整文档处理:适合需要整体分析或频繁修改文档结构的场景。
读写功能:既能读取XML文件,也可生成并保存XML文档。
缺点:
内存消耗高:需将整个文档加载到内存,处理大文件时效率低下。
性能瓶颈:解析和生成速度较慢,不适合流式或实时处理。
适用场景:
中小型XML文件、需要随机访问节点或修改文档结构的场景。
示例代码

// 读取 XML 文件,展示所有书籍信息
void DomReadXML(const QString& filePath) {QFile file(filePath);if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {qDebug() << "无法打开文件:" << filePath;return;}QDomDocument doc;if (!doc.setContent(&file)) {qDebug() << "无法解析 XML 文件";file.close();return;}file.close();QDomElement root = doc.documentElement();QDomNodeList bookList = root.elementsByTagName("book");for (int i = 0; i < bookList.count(); ++i) {QDomElement book = bookList.at(i).toElement();QString id = book.attribute("id");qDebug() << "书籍 ID:" << id;QDomElement title = book.firstChildElement("title");	qDebug() << "标题:" << (title.isNull() ? "N/A" : title.text());QDomElement author = book.firstChildElement("author");qDebug() << "作者:" << (author.isNull() ? "N/A" : author.text());QDomElement price = book.firstChildElement("price");qDebug() << "价格:" << (price.isNull() ? "N/A" : price.text());qDebug() << "-------------------";}
}
// 写入 XML 文件,追加新书籍
void DomWriteXML(const QString& filePath) {QFile file(filePath);if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {qDebug() << "无法打开文件用于读取:" << filePath;return;}QDomDocument doc;if (!doc.setContent(&file)) {qDebug() << "无法读取文档内容";file.close();return;}file.close();QDomElement root = doc.documentElement();// 创建新 <book> 元素QDomElement newBook = doc.createElement("book");newBook.setAttribute("id", "4");QDomElement title = doc.createElement("title");title.appendChild(doc.createTextNode("Effective Modern C++"));QDomElement author = doc.createElement("author");author.appendChild(doc.createTextNode("Scott Meyers"));QDomElement price = doc.createElement("price");price.appendChild(doc.createTextNode("49.99"));newBook.appendChild(title);//title作为newBook的子节点newBook.appendChild(author);//author作为newBook的子节点newBook.appendChild(price);//price作为newBook的子节点root.appendChild(newBook);//newBook作为根元素的子节点// 保存更新后的文档if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) {qDebug() << "无法打开文件用于写入:" << filePath;return;}QTextStream stream(&file);doc.save(stream, 4); // 缩进 4 空格file.close();qDebug() << "成功写入 XML 文件";
}

2、流式处理,核心类为QXmlStreamReader(读取) 和 QXmlStreamWriter(写入)

流式读取(QXmlStreamReader)
基本概念:
基于拉模型的流式解析器,逐行读取XML文件,按需处理标记(Token),无需加载整个文档。
优点:
高效低内存:适合处理超大XML文件,内存占用低。
易用性:相比SAX更简洁,通过循环读取Token解析数据。
快速访问:仅解析所需部分,跳过无关内容。
缺点:
顺序访问限制:只能向前遍历,无法回溯或随机访问。
状态管理复杂:需手动维护解析状态,处理嵌套结构时逻辑较繁琐。
适用场景:
读取大文件、仅需提取部分数据或流式处理场景(如日志解析)。
示例代码

// 读取 XML 文件
void StreamReadXML(const QString& filePath) {QFile file(filePath);if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {qDebug() << "无法打开文件:" << filePath;return;}QXmlStreamReader reader(&file);while (!reader.atEnd()) {QXmlStreamReader::TokenType token = reader.readNext();if (token == QXmlStreamReader::StartElement) {if (reader.name() == "book") {QXmlStreamAttributes attrs = reader.attributes();QString id = attrs.value("id").toString();qDebug() << "书籍 ID:" << id;} else if (reader.name() == "title") {qDebug() << "标题:" << reader.readElementText();} else if (reader.name() == "author") {qDebug() << "作者:" << reader.readElementText();} else if (reader.name() == "price") {qDebug() << "价格:" << reader.readElementText();} else if (reader.name() == "mybook") {QXmlStreamAttributes attrs = reader.attributes();qDebug() << "mybook id:" << attrs.value("id").toString();qDebug() << "mybook title:" << attrs.value("title").toString();}}}if (reader.hasError()) {qDebug() << "读取错误:" << reader.errorString();}file.close();
}

流式写入(QXmlStreamWriter)
基本概念:
用于顺序生成XML文档,通过API逐步写入标签、属性和内容。
优点:
高效写入:逐步生成XML,无需构建完整结构。
代码简洁:API设计直观,易于生成标准XML格式。
低内存占用:适合动态生成大型XML文件。
缺点:
结构依赖性强:需手动管理标签闭合和嵌套,易因逻辑错误导致格式异常。
不可修改:生成后无法直接修改已写入内容。
适用场景:
顺序生成XML文件、数据导出或日志记录等场景。
示例代码

// 写入 XML 文件
void StreamWriteXML(const QString& filePath) {QFile file(filePath);if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) {qDebug() << "无法打开文件:" << filePath;return;}QXmlStreamWriter writer(&file);writer.setAutoFormatting(true); // 自动缩进writer.writeStartDocument();writer.writeStartElement("book");writer.writeAttribute("id", "4");writer.writeTextElement("title", "Effective Modern C++");writer.writeTextElement("author", "Scott Meyers");writer.writeTextElement("price", "49.99");writer.writeEndElement(); // bookwriter.writeEndDocument();file.close();
}

使用建议

1、对于纯读取、纯写入、纯追加(即对原文档不做修改)的场景,优先考虑流式处理,效率更高。
2、对于中小型XML文档且需要修改原有结构和内容,考虑使用DOM方式。

相关文章:

Qt读写XML文档

XML 结构与概念简介 XML&#xff08;可扩展标记语言&#xff09; 是一种用于存储和传输结构化数据的标记语言。其核心特性包括&#xff1a; 1、树状结构&#xff1a;XML 数据以层次化的树形结构组织&#xff0c;包含一个根元素&#xff08;Root Element&#xff09;&#xff…...

学习Python的第一天之网络爬虫

30岁程序员学习Python的第一天&#xff1a;网络爬虫 Requests库 1、requests库安装 windows系统通过管理员打开cmd&#xff0c;运行pip install requests!测试案例&#xff1a; 2、Requests库的两个重要对象 Response对象Resoponse对象包含服务器返回的所有信息&#xff…...

前端展示后端返回的图片流

一、请求 重点&#xff1a;添加responseType: “blob”, // Vue2组件中请求示例 methods: {fetchImage() {return axios.get(/api/getImage, {params: { id: 123 },responseType: blob // 关键配置&#xff08;重点&#xff0c;必须配置&#xff09;});} }或 export function…...

65.微服务保姆教程 (八) 微服务开发与治理实战

微服务开发与治理实战:搭建一个简单的微服务系统 在这个实战中,我们将使用以下技术栈来搭建一个简单的微服务系统: 注册中心和配置中心:使用 Nacos。服务开发框架:使用 Spring Boot。服务间通信:使用 Feign。API 网关:使用 Spring Cloud Gateway。依赖管理工具:使用 M…...

AI服务器通常会运用在哪些场景当中?

人工智能行业作为现代科技的杰出代表&#xff0c;在多个领域当中发展其强大的应用能力和价值&#xff0c;随之&#xff0c;AI服务器也在各个行业中日益显现出来&#xff0c;为各个行业提供了强大的计算能力和处理能力&#xff0c;帮助企业处理复杂的大规模数据&#xff0c;本文…...

linux下的Redis的编译安装与配置

配合做开发经常会用到redis&#xff0c;整理下编译安装配置过程&#xff0c;仅供参考&#xff01; --------------------------------------Redis的安装与配置-------------------------------------- 下载 wget https://download.redis.io/releases/redis-6.2.6.tar.gz tar…...

【官方题解】StarryCoding 入门教育赛 2 | acm | 蓝桥杯 | 新手入门

比赛传送门&#xff1a; 本场比赛开始时题面存在一些问题&#xff0c;私密马赛&#xff01; A.池化【入门教育赛】 根据题目所给公式计算即可。 #include "bits/stdc.h"signed main() {int t; std::cin >> t;while (t --) {int l, k, s, p; std::cin >&…...

无人机相关技术与故障排除笔记

无人机相关技术与故障排除笔记 本文档整理了关于无人机电调、电机、通信协议、传感器以及硬件故障排除相关的笔记和解释。 1. 电调 (ESC) PWM 输出初始化设置 初始化电调&#xff08;电子调速器&#xff09;的 PWM 输出功能时&#xff0c;设置 频率 400Hz、分辨率 10000、初…...

SpringSecurity(自定义异常处理)

文末有本篇文章的项目源码可供下载学习。 在实际的项目开发过程中&#xff0c;我们对于认证失败或者授权失败需要像接口一样返回相同结构的json数据&#xff0c;这样可以让前端对响应进行统一的处理。要实现这个功能我们需要知道SpringSecurity的异常处理机制。 在SpringSecu…...

Java——反射

目录 5 反射 5 反射 类信息&#xff1a;方法、变量、构造器、继承和实现的类或接口。反射&#xff1a;反射是 Java 中一项强大的特性&#xff0c;它赋予了程序在运行时动态获取类的信息&#xff0c;并能够调用类的方法、访问类的字段以及操作构造函数等的能力。通过反射&#…...

本地玩AI绘画 | StableDiffusion安装到绘画

环境须知 Cuda必须安装 不需要安装Python&#xff0c;因为该项目会自动安装Python3.10的虚拟环境 1.下载StableDiffusionWebUI压缩包并解压 下载方式一&#xff1a; 从Github下载https://github.com/AUTOMATIC1111/stable-diffusion-webui 的压缩包&#xff0c;解压后名为…...

C++:书架

【描述】 John最近买了一个书架用来存放奶牛养殖书籍&#xff0c;但书架很快被存满了&#xff0c;只剩最顶层有空余。 John共有N头奶牛(1 ≤ N ≤ 20,000)&#xff0c;每头奶牛有自己的高度Hi(1 ≤ Hi ≤ 10,000)&#xff0c;N头奶牛的总高度为S。书架高度为B(1 ≤ B ≤ S <…...

project从入门到精通(四)

目录 日程表的设置和妙用 为日程表视图添加任务 用日程表视图的好处 ​编辑 查找任务的前置任务和后续任务 方法1&#xff1a;采用复合视图的方式 方法3&#xff1a;关系图法 方法4&#xff1a;通过任务路径的方式检查所选任务的前置任务 前置任务和驱动前置任务的区…...

git项目迁移,包括所有的提交记录和分支 gitlab迁移到gitblit

之前git都是全新项目上传&#xff0c;没有迁移过&#xff0c;因为迁移的话要考虑已有项目上的分支都要迁移过去&#xff0c;提交记录能迁移就好&#xff1b;分支如果按照全新项目上传的方式需要新git手动创建好老git已有分支&#xff0c;在手动一个一个克隆老项目分支代码依次提…...

基于STM32、HAL库的SST26VF064B NOR FLASH存储器驱动应用程序设计

一、简介: SST26VF064B是Microchip公司生产的一款64Mbit(8MB)串行闪存器件,采用SPI接口通信,具有以下特点: 工作电压:2.7-3.6V 最高104MHz时钟频率 统一4KB扇区结构 快速擦除和编程时间 低功耗特性 支持标准SPI、Dual SPI和Quad SPI模式 二、硬件接口: STM32L4引脚SST26V…...

【黑马JavaWeb+AI知识梳理】后端Web基础01 - Maven

Maven Maven核心 Maven概述 定义&#xff1a; Maven是一款用于管理和构建Java项目的工具&#xff0c;是apache旗下的一个开源项目&#xff0c;基于项目对象模型&#xff08;POM&#xff0c;project object model&#xff09;的概念&#xff0c;通过一小段描述信息来管理项目的…...

港大今年开源了哪些SLAM算法?

过去的5个月&#xff0c;香港大学 MaRS 实验室陆续开源了四套面向无人机的在线 SLAM 框架&#xff1a;**FAST-LIVO2 、Point-LIO&#xff08;grid-map 分支&#xff09; 、Voxel-SLAM 、Swarm-LIO2 **。这四套框架覆盖了单机三传感器融合、高带宽高速机动、长时间多级地图优化以…...

Spring框架(1)

Spring框架是Java企业级开发中最受欢迎的框架之一&#xff0c;它通过简化开发流程、降低耦合度&#xff0c;让开发者能够更专注于业务逻辑的实现。本文将带你了解Spring框架的核心概念和基本用法。 一、Spring框架简介 Spring是一个轻量级的开源Java开发框架&#xff0c;由Ro…...

边缘计算:技术概念与应用详解

引言 随着物联网&#xff08;IoT&#xff09;、5G 和人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;传统的云计算架构在处理海量数据和实时计算需求时逐渐显现出瓶颈。边缘计算&#xff08;Edge Computing&#xff09;作为一种新兴的计算范式&#xff0c;通过将计…...

Godot4.3类星露谷游戏开发之【昼夜循环】

千里之行&#xff0c;始于足下 文章目录 零、 笔记一、创造时间二、产生颜色三、搭建测试环境四、测试五、免费开源资产包 零、 笔记 为了让游戏可以拥有白天和黑夜&#xff0c;我们需要像上帝一样&#xff0c;在游戏中创造时间的规则&#xff0c;并在不同的时间点产生不同的颜…...

数据结构每日一题day17(链表)★★★★★

题目描述&#xff1a;假设有两个按元素值递增次排列的线性表&#xff0c;均以单链表形式存储。请编与算法将这两个单链表归并为一个按元素值依次递减排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。 算法思想&#xff1a; 1.初始化&#xff1a; 创建一个新…...

深入解析多线程与多进程:从理论到Python实践

一、并发编程的核心概念 1.1 多线程的本质与实现原理 多线程&#xff08;Multithreading&#xff09;是指在一个进程内创建多个执行流&#xff0c;共享同一进程资源&#xff08;如内存空间、文件句柄等&#xff09;的编程模型。其核心特征包括&#xff1a; ​​资源共享​​…...

当当网Top500书籍信息爬取与分析

爬取当当网的Top500书籍信息&#xff0c;并对书籍的评价数量进行排序&#xff0c;然后绘制前十名的条形图&#xff0c;然后对各个出版社出版的书籍数量进行排序&#xff0c;绘制百分比的饼图 # 导入所需的模块 import re # 正则表达式模块&#xff0c;用于提取文本中的特定模…...

Android Framework 记录之二

23、services目录 文件描述class AlarmManagerService extends IAlarmManager.Stub {//定时管理服务public class AppOpsService extends IAppOpsService.Stub { // 程序选项服务public class AppsLaunchFailureReceiver extends BroadcastReceiver { //app启动失败广播class A…...

RabbitMQ 幂等性与消息可靠性保障

一、引言 RabbitMQ 是一个广泛应用于软件开发、数据传输、微服务等领域的高效、可靠的开源消息队列系统1。在分布式系统中&#xff0c;保证消息的可靠传递和幂等性是至关重要的&#xff0c;它能够确保系统在各种复杂情况下的稳定性和数据的准确性。 二、消息可靠性保障 &…...

neo4j图数据库基本概念和向量使用

一.节点 1.新建节点 create (n:GroupProduct {name:都邦高保额团意险,description: "保险产品名称"} ) return n CREATE&#xff1a;Neo4j 的关键字&#xff0c;用于创建新节点或关系。 (n:GroupProduct)&#xff1a; n 是节点的临时别名&#xff08;变量名&#…...

修复笔记:获取 torch._dynamo 的详细日志信息

一、问题描述 在运行项目时&#xff0c;遇到与 torch._dynamo 相关的报错&#xff0c;并且希望获取更详细的日志信息以便于进一步诊断问题。 二、相关环境变量设置 通过设置环境变量&#xff0c;可以获得更详细的日志信息&#xff1a; set TORCH_LOGSdynamo set TORCHDYNAM…...

Windows平台下的Qt发布版程序打包成exe可执行文件(带图标)|Qt|C++

首先先找一个可执行文件的图标 可以去阿里的矢量图库里找 iconfont-阿里巴巴矢量图标库 找到想要的图标下载下来 此时的图标是png格式的&#xff0c;我们要转到icon格式的文件 要使用到一个工具Drop Icons_2.1.1.rar - 蓝奏云 生成icon文件后把icon文件放到你项目的根目录下…...

PDF解析新范式:Free2AI工具实测

在数字化浪潮中,PDF文件已成为企业、政府及个人存储与传递信息的核心载体。然而,PDF内容的提取与处理始终是行业痛点——无论是合同解析、研究报告整理,还是大规模知识库构建,传统方法常面临效率低、成本高、准确率不足等问题。Free2AI基于智能体技术与大模型算力,为PDF内…...

CSS--图片链接垂直居中展示的方法

原文网址&#xff1a;CSS--图片链接垂直居中展示的方法-CSDN博客 简介 本文介绍CSS图片链接垂直居中展示的方法。 图片链接 问题复现 源码 <html xml:lang"cn" lang"cn"><head><meta http-equiv"Content-Type" content&quo…...