Qt推荐使用QXmlStreamReader和QXmlStreamWriter处理XML文件。1. QXmlStreamReader以流式方式逐节点解析,内存占用低,适合大文件;通过readNext()读取token,结合isStartElement()、isEndElement()等判断节点类型,可灵活提取数据。2. QXmlStreamWriter提供writeStartElement()、writeAttribute()等方法生成格式化XML,调用setAutoFormatting(true)提升可读性,自动处理编码与转义。3. 使用时需检查文件打开状态,读取后验证hasError(),写入注意层级匹配;相比DOM方式更高效省资源,适用于复杂或大型XML场景。

Qt 框架提供了多种方式读写 XML 文件,其中 QXmlStreamReader 和 QXmlStreamWriter 是最常用且推荐的方式。它们基于流式处理,内存占用低、效率高,适合处理大文件或结构复杂的 XML 数据。
1. 使用 QXmlStreamReader 读取 XML 文件
QXmlStreamReader 以逐节点的方式解析 XML,支持跳过未知内容,适用于灵活的解析场景。
基本使用步骤:
- 创建 QFile 并打开 XML 文件
- 将文件传入 QXmlStreamReader
- 循环读取 token(标签、文本、属性等)
- 根据 token 类型进行相应处理
#include#include #include void readXml(const QString &fileName) { QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) return; QXmlStreamReader reader(&file); while (!reader.atEnd()) { reader.readNext(); if (reader.isStartElement()) { if (reader.name() == "setting") { QXmlStreamAttributes attrs = reader.attributes(); if (attrs.hasAttribute("name") && attrs.hasAttribute("value")) { std::cout << "Name: " << attrs.value("name").toString().toStdString() << ", Value: " << attrs.value("value").toString().toStdString() << std::endl; } } } } if (reader.hasError()) { std::cerr << "Error: " << reader.errorString().toStdString().c_str(); } file.close(); }
常见判断方法:
- isStartElement():是否是开始标签
- isEndElement():是否是结束标签
- isCharacters():是否是文本内容(注意过滤空白)
- isComment():是否是注释
2. 使用 QXmlStreamWriter 写入 XML 文件
QXmlStreamWriter 提供简洁 API 来生成格式良好的 XML 文件,自动处理转义和编码。
基本流程:
- 打开 QFile 或其他 QIODevice
- 创建 QXmlStreamWriter 实例
- 设置输出选项(如自动换行)
- 使用 writeStartElement、writeAttribute、writeCharacters 等写入内容
#include#include void writeXml(const QString &fileName) { QFile file(fileName); if (!file.open(QIODevice::WriteOnly)) return; QXmlStreamWriter writer(&file); writer.setAutoFormatting(true); // 启用格式化输出 writer.writeStartDocument(); writer.writeStartElement("config"); writer.writeStartElement("setting"); writer.writeAttribute("name", "volume"); writer.writeAttribute("value", "80"); writer.writeEndElement(); // setting writer.writeStartElement("setting"); writer.writeAttribute("name", "fullscreen"); writer.writeAttribute("value", "true"); writer.writeEndElement(); // setting writer.writeEndElement(); // config writer.writeEndDocument(); file.close(); }
关键方法说明:
- writeStartDocument():写入 XML 声明(如 )
- writeStartElement(tag):开始一个标签
- writeAttribute(name, value):添加属性
- writeCharacters(text):写入标签内的文本
- writeEndElement():关闭当前标签
- writeEndDocument():完成文档
3. 注意事项与技巧
使用这两个类时需要注意以下几点:
- 始终检查文件是否成功打开
- 读取时建议用 !reader.atEnd() 控制循环,避免无限循环
- 写入时开启 setAutoFormatting(true) 可提高可读性
- QXmlStreamReader 不会报错所有异常,需调用 hasError() 明确判断
- 中文等非 ASCII 字符在 QFile 中默认使用 UTF-8,无需额外设置编码
对于嵌套结构,可以结合栈或状态变量跟踪层级;对于大型文件,流式处理比 DOM 方式(如 QDomDocument)更节省内存。
基本上就这些。掌握 QXmlStreamReader 和 QXmlStreamWriter 后,就能高效处理大多数 XML 场景了。










