Qt框架怎么读写XML文件_Qt框架QXmlStreamReader/Writer使用教程

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

Qt 框架提供了多种方式读写 XML 文件,其中 QXmlStreamReaderQXmlStreamWriter 是最常用且推荐的方式。它们基于流式处理,内存占用低、效率高,适合处理大文件或结构复杂的 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 等写入内容
示例代码:生成一个 settings.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();
}

关键方法说明:

  • 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 场景了。