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方式。

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

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

相关文章

lambda 表达式

C 的 lambda 表达式 是一种轻量、内联的函数对象写法&#xff0c;广泛用于标准算法、自定义回调、事件响应等场景。它简洁且强大。以下将系统、详细地讲解 lambda 的语法、捕获规则、应用技巧和实际使用场景。 &#x1f9e0; 一、基本语法 [捕获列表](参数列表) -> 返回类型…

Web端项目系统访问页面很慢,后台数据返回很快,网络也没问题,是什么导致的呢?

Web端访问缓慢问题诊断指南(测试工程师专项版) ——从浏览器渲染到网络层的全链路排查方案 一、问题定位黄金法则(前端性能四象限) 1. [网络层] 数据返回快 ≠ 资源加载快(检查Content Download时间) 2. [渲染层] DOM复杂度与浏览器重绘(查看FPS指标) 3. [执行层…

Docker网络模式深度解析:Bridge与Host模式对比及实践指南

#作者&#xff1a;邓伟 文章目录 一、引言二、Bridge模式&#xff08;网桥模式&#xff09;2.1 工作原理2.2 核心特性2.4 适用场景2.5 优缺点分析 三、Host模式3.1 工作原理3.2 核心特性3.3 配置方法3.4 适用场景3.5 优缺点分析 四、网桥模式与Host模式对比五、最佳实践与注意…

React+Taro选择日期组件封装

话不多说&#xff0c;直接上效果 1.页面渲染时间模块 {this.renderCalendarPopup()}2.引入时间组件弹层&#xff0c;state中加入showPopup(控制什么时候展示时间选择弹层)&#xff0c;time(选择后的时间值) private renderCalendarPopup () > {const { showPopup, time…

备战蓝桥杯国赛第一天-atcoder-beginner-contest404

B. 因为只有四种情况&#xff0c;旋转90/180/270度后替换&#xff0c;直接替换&#xff0c;暴力即可 C. 循环图的定义是每个点出度为2&#xff0c;而且只有一个环的&#xff0c;所以先判断出度&#xff0c;再判断是否成环 #include <bits/stdc.h> using namespace st…

Linux59 SSH配置前瞻 JumpServer双网卡ping通

为什么Ping这个IP地址Ping得通 本地址 [rootlocalhost network-scripts]# cat ifcfg-ens33 iTYPEEthernet BOOTPROTOnone DEFROUTEyes DEVICEens33 ONBOOTno IPADDR192.168.235.4 NETMASK255.255.255.0 GATEWAY192.168.235.2 DNS1114.114.114.114 [rootlocalhost network-scrip…

Spring框架(1)

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

QWindowkit 实现无边框,阴影支持系统边栏缩放等功能

一.感谢作者,QWindowkit 源码地址: GitHub - stdware/qwindowkit: Cross-platform frameless window framework for Qt. Support Windows, macOS, Linux. 二.集成pro工程: QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++17 # Yo…

-bash: /usr/local/mysql/bin/mysqld: No such file or directory

-bash: /usr/local/mysql/bin/mysqld: No such file or directory 1.Mysql安装常见的报错信息1.1.报错信息1.2.分析问题1.3.解决问题 endl 1.Mysql安装常见的报错信息 1.1.报错信息 [rootRocky9-12 ~]#echo $PATH /root/.local/bin:/root/bin:/usr/local/mysql/bin:/usr/loca…

【愚公系列】《Manus极简入门》027-数据故事讲述师:“数据叙事魔法师”

&#x1f31f;【技术大咖愚公搬代码&#xff1a;全栈专家的成长之路&#xff0c;你关注的宝藏博主在这里&#xff01;】&#x1f31f; &#x1f4e3;开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主&#xff01; &#x1f…

PostgreSQL可见性映射VM

1.可见性映射 清理过程的代价高昂&#xff0c;为了减小清理的开销&#xff0c;在PostgreSQL 8.4版中引入了VM。 VM的基本概念很简单。 每个表都拥有各自的可见性映射&#xff0c;用于保存表文件中每个页面的可见性。 页面的可见性确定了每个页面是否包含死元组。清理过程可以…

LeapVAD:通过认知感知和 Dual-Process 思维实现自动驾驶飞跃——论文阅读

《LeapVAD: A Leap in Autonomous Driving via Cognitive Perception and Dual-Process Thinking》2025年1月发表&#xff0c;来自浙江大学、上海AI实验室、慕尼黑工大、同济大学和中科大的论文。 尽管自动驾驶技术取得了显著进步&#xff0c;但由于推理能力有限&#xff0c;数…

二分系列题

1. 搜索插入位置 /*** 查找插入的位置&#xff1a;返回第一个大于等于 target 的索引&#xff1b;* 如果 target 大于所有元素&#xff0c;则返回数组长度&#xff08;即插入到末尾&#xff09;*/ class Solution {public int searchInsert(int[] nums, int target) {int left …

Octave 简介:一款强大的开源科学计算工具

引言 在科学计算、数据分析和数值模拟的领域&#xff0c;选择合适的工具对于提升工作效率和性能至关重要。虽然市面上有许多选择&#xff0c;但 GNU Octave 作为一款功能强大、开源免费的软件&#xff0c;它在科学计算中脱颖而出。如果你是学生、研究人员或开发者&#xff0c;…

TI Code Composer Studio编译时SDK报错问题解决

1. 我们使用TI的CCS&#xff08;Code Composer Studio&#xff09;编译环境编译工程时&#xff0c;首次安装很可能会遇到编译器找不到SDK的问题。 2. 当CCS编程工具找不到SDK路径时&#xff0c;会有如下报错&#xff1a; Problems窗口提示&#xff1a; Product com.ti.SIMPL…

MySQL大数据量查询优化

1.在回表数据量不大的情况下考虑增加索引&#xff0c;如果有多个筛选条件的情况下可以考虑添加联合索引&#xff0c;并且满足最佳左前缀的原则。 2.避免全表查询返回不需要的字段&#xff0c;增加磁盘io的压力 3.大表的分页查询&#xff0c;limit越大效率越低&#xff0c;可以先…

【Linux网络#5】(UDP的简单应用)DictServer(中译英字典)| ChatServer(简单聊天室)

1.中译英字典 -- DictServer 我们这里先中途插入一个趣味的翻译显示实验&#xff0c;在 EchoServer 的基础上来实现&#xff0c;大部分代码基本都没变&#xff0c;修改了一少部分代码&#xff0c;大家可以仔细看看 先给定一些等会我们要翻译的单词数据 dict.txt apple: 苹果…

DeepSeek实战--微调

1.为什么是微调 &#xff1f; 微调LLM&#xff08;Fine-tuning Large Language Models&#xff09; 是指基于预训练好的大型语言模型&#xff08;如GPT、LLaMA、PaLM等&#xff09;&#xff0c;通过特定领域或任务的数据进一步训练&#xff0c;使其适应具体需求的过程。它是将…

FTP/TFTP/SSH/Telnet

目录 一、FTP&#xff08;文件传输协议&#xff09; 定义 工作原理 特点 应用场景 二、TFTP&#xff08;简单文件传输协议&#xff09; 定义 工作原理 特点 应用场景 三、SSH&#xff08;安全外壳协议&#xff09; 定义 工作原理 特点 应用场景 四、Telnet&…

K8S常见问题汇总

一、 驱逐 master 节点上的所有 Pod 这会“清空”一个节点&#xff08;包括 master&#xff09;上的所有可驱逐的 Pod&#xff1a; kubectl drain <master-node-name> --ignore-daemonsets --delete-emptydir-data--ignore-daemonsets&#xff1a;保留 DaemonSet 类型的…