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 数据。
QXmlStreamReader 以逐节点的方式解析 XML,支持跳过未知内容,适用于灵活的解析场景。
基本使用步骤:
#include#include #include v oid 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(); }
常见判断方法:
QXmlStreamWriter 提供简洁 API 来生成格式良好的 XML 文件,自动处理转义和编码。
基本流程:
#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(); }
关键方法说明:
使用这两个类时需要注意以下几点:
对于嵌套结构,可以结合栈或状态变量跟踪层级;对于大型文件,流式处理比 DOM 方式(如 QDomDocument)更节省内存。
基本上就这些。掌握 QXmlStreamReader 和 QXmlStreamWriter 后,就能高效处理大多数 XML 场景了。