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

Qt如何读写xml文件,几种方式对比,读写xml的Demo工程

在 Qt 中读写 XML 文件,常用的方式有以下几种,每种方式的特点、适用场景和优缺点如下:


一、Qt 读写 XML 的几种方式对比

方式主要类特点优点缺点适用场景
QDomDocumentQDomDocument / QDomElement / QDomNodeDOM方式,加载整个XML到内存中,以树形结构操作操作直观,适合频繁修改节点、属性内存占用较大,大文件处理慢结构复杂、需要随机访问的XML文件
QXmlStreamReader/WriterQXmlStreamReader / QXmlStreamWriter流式方式,按顺序读取/写入内存占用小,速度快不能随意跳转或修改已读取的内容大文件、只读/只写、顺序处理
QXmlSimpleReader (SAX)QXmlSimpleReader事件驱动解析(类似SAX)性能高,适合超大文件使用麻烦,写法冗长超大XML文件的只读解析

选择建议

  • 需要随机读写和修改QDomDocument

  • 需要顺序快速读写QXmlStreamReader/Writer

  • 超大文件且只解析:QXmlSimpleReader

👉 综合来看:对于常见的配置文件、结构化数据,推荐使用 QDomDocument,因为代码简洁、易维护。


二、推荐方案:QDomDocument

以下提供一个Qt Demo 工程,演示如何使用 QDomDocument 读写 XML 文件。

工程下载地址https://download.csdn.net/download/2501_91893428/91940573

1️⃣ Demo 工程结构

 
QtXmlDemo/
├── main.cpp
├── xmlreaderwriter.h
├── xmlreaderwriter.cpp
└── demo.xml  (示例xml文件)

2️⃣ 示例 XML 文件(demo.xml)

 
<?xml version="1.0" encoding="UTF-8"?>
<config><user name="Keven" age="30"/><settings theme="dark" language="en"/>
</config>

3️⃣ 代码实现

xmlreaderwriter.h
 
#ifndef XMLREADERWRITER_H
#define XMLREADERWRITER_H#include <QObject>
#include <QDomDocument>class XmlReaderWriter : public QObject
{Q_OBJECT
public:explicit XmlReaderWriter(QObject *parent = nullptr);bool readXml(const QString &filePath);   // 读取XMLbool writeXml(const QString &filePath);  // 写入XML
};#endif // XMLREADERWRITER_H
xmlreaderwriter.cpp
 
#include "xmlreaderwriter.h"
#include <QFile>
#include <QDebug>XmlReaderWriter::XmlReaderWriter(QObject *parent) : QObject(parent) {}bool XmlReaderWriter::readXml(const QString &filePath)
{QFile file(filePath);if (!file.open(QIODevice::ReadOnly))return false;QDomDocument doc;if (!doc.setContent(&file)) {file.close();return false;}file.close();// 根节点QDomElement root = doc.documentElement();qDebug() << "Root Element:" << root.tagName();// 遍历子节点QDomNode node = root.firstChild();while (!node.isNull()) {if (node.isElement()) {QDomElement elem = node.toElement();qDebug() << "Tag:" << elem.tagName()<< "Name:" << elem.attribute("name")<< "Age:" << elem.attribute("age")<< "Theme:" << elem.attribute("theme")<< "Language:" << elem.attribute("language");}node = node.nextSibling();}return true;
}bool XmlReaderWriter::writeXml(const QString &filePath)
{QDomDocument doc;QDomProcessingInstruction instr =doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");doc.appendChild(instr);QDomElement root = doc.createElement("config");doc.appendChild(root);// 添加user节点QDomElement user = doc.createElement("user");user.setAttribute("name", "LuoXiao");user.setAttribute("age", "32");root.appendChild(user);// 添加settings节点QDomElement settings = doc.createElement("settings");settings.setAttribute("theme", "light");settings.setAttribute("language", "zh");root.appendChild(settings);QFile file(filePath);if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate))return false;QTextStream out(&file);doc.save(out, 4); // 缩进4空格file.close();return true;
}
main.cpp
 
#include <QCoreApplication>
#include "xmlreaderwriter.h"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);XmlReaderWriter xml;QString path = "demo.xml";// 写入if (xml.writeXml(path))qDebug() << "XML写入成功:" << path;// 读取if (xml.readXml(path))qDebug() << "XML读取成功";return a.exec();
}

4️⃣ 运行结果示例

 
XML写入成功: "demo.xml"
Root Element: "config"
Tag: "user" Name: "LuoXiao" Age: "32" Theme: "" Language: ""
Tag: "settings" Name: "" Age: "" Theme: "light" Language: "zh"
XML读取成功

✅总结

  • QDomDocument 适合常规配置文件、结构化数据,代码清晰易懂。

  • QXmlStream 更适合超大文件、高性能需求。


文章转载自:

http://0FWy1rSD.mhcys.cn
http://Amq1UAal.mhcys.cn
http://OAmLF8ms.mhcys.cn
http://QMyxp4tz.mhcys.cn
http://zqxIEdCB.mhcys.cn
http://8o6YiE7T.mhcys.cn
http://qe2OeFbx.mhcys.cn
http://EPq2IEDu.mhcys.cn
http://wDgY0co3.mhcys.cn
http://0kPURTNl.mhcys.cn
http://Uu4aAhFm.mhcys.cn
http://pHcXdHud.mhcys.cn
http://TxchUYtS.mhcys.cn
http://oBUHrc7N.mhcys.cn
http://ImpCy5IR.mhcys.cn
http://IwE6ThV0.mhcys.cn
http://8wVAitVs.mhcys.cn
http://l87xRsnl.mhcys.cn
http://au1l4zDY.mhcys.cn
http://ZyRzo50Q.mhcys.cn
http://k8HyPOxv.mhcys.cn
http://hdKj7nFf.mhcys.cn
http://CapzpccL.mhcys.cn
http://7OLDlup6.mhcys.cn
http://ss3Os7yF.mhcys.cn
http://AtM2IxCR.mhcys.cn
http://1TX0BXB9.mhcys.cn
http://p4nBbwd5.mhcys.cn
http://iLkanG8m.mhcys.cn
http://fDYnLY5E.mhcys.cn
http://www.dtcms.com/a/383763.html

相关文章:

  • 子网划分专项训练-1,eNSP实验,vlan/dhcp,IP规划
  • 云原生改造实战:Spring Boot 应用的 Kubernetes 迁移全指南
  • 看门狗的驱动原理
  • [论文阅读] 人工智能 + 软件工程 | 大语言模型驱动的多来源漏洞影响库识别研究解析
  • 【前缀和+哈希表】P3131 [USACO16JAN] Subsequences Summing to Sevens S
  • 05.【Linux系统编程】进程(进程概念、进程状态(注意僵尸和孤儿)、进程优先级、进程切换和调度)
  • 【从零开始java学习|小结】记录学习和编程中的问题
  • 图像拼接案例,抠图案例
  • 分层解耦讲解
  • 安装Hadoop中遇到的一些问题和解决
  • 音视频-色域
  • 返利软件的分布式缓存架构:Redis集群在高并发场景下的优化策略
  • 如何让知识上传与查询更便捷
  • set/multiset容器
  • 区块链:搭建简单Fabric网络并调用智能合约
  • Keepalived的详细实操安装流程及其配置文件选项的详解
  • windows下,podman迁移镜像文件位置
  • 技能补全之正则表达式
  • Altium Designer(AD24)打开工程文件的几种方法
  • 26考研——内存管理(3)
  • 知识库缺乏维护和清理机制会造成哪些后果
  • android studio 华为 安装app 层层验证
  • 机器学习(三):决策树
  • 气缸夹爪机构分析
  • np.sum(e_x, axis=-1, keepdims=True)
  • kafka--基础知识点--5.3--producer事务
  • SCI论文组成部分
  • 软考 系统架构设计师系列知识点之杂项集萃(146)
  • C语言之函数
  • A050基于博途西门子1200PLC智能交通灯控制系统