Qt如何读写xml文件,几种方式对比,读写xml的Demo工程
在 Qt 中读写 XML 文件,常用的方式有以下几种,每种方式的特点、适用场景和优缺点如下:
一、Qt 读写 XML 的几种方式对比
方式 | 主要类 | 特点 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|---|
QDomDocument | QDomDocument / QDomElement / QDomNode | DOM方式,加载整个XML到内存中,以树形结构操作 | 操作直观,适合频繁修改节点、属性 | 内存占用较大,大文件处理慢 | 结构复杂、需要随机访问的XML文件 |
QXmlStreamReader/Writer | QXmlStreamReader / 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 更适合超大文件、高性能需求。