Qt开发:XML文件的写入与读取

一、使用 QDomDocument操作节点

1.1 将信息写入XML文件中

#include <QDomDocument>
#include <QTextStream>
#include <QFile>
#include <QDir>

void writeXmlWithStreamWriter() {
    QDomDocument document; // 创建对象

    QDomProcessingInstruction version; // 写入XML头部(添加处理命令)
    version = document.createProcessingInstruction("xml", "version = \"1.0\" encoding = \"utf8\"");
    document.appendChild(version);

    QDomElement root = document.createElement("Books");
    document.appendChild(root);

    // 模拟多个书
    for (int i = 1; i <= 3; ++i) {
        QDomElement book = document.createElement("Book");
        book.setAttribute("id", QString::number(i));

        QDomElement title = document.createElement("Title");
        QDomText text = document.createTextNode(QString("Book Title %1").arg(i));
        title.appendChild(text);

        book.appendChild(title);
        root.appendChild(book);
    }

    // 保存到文件
    QDir dir(QCoreApplication::applicationDirPath());
    QString strXmlPath = dir.absoluteFilePath("book_xml.xml");

    QFile file(strXmlPath);
    if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        QTextStream out(&file);
        document.save(out, 4);
        file.close();
    }
}

输出结果:

<?xml version = "1.0" encoding = "utf8"?>
<Books>
    <Book id="1">
        <Title>Book Title 1</Title>
    </Book>
    <Book id="2">
        <Title>Book Title 2</Title>
    </Book>
    <Book id="3">
        <Title>Book Title 3</Title>
    </Book>
</Books>

1.2.从XML文件中读取信息

#include <QDomDocument>
#include <QTextStream>
#include <QFile>
#include <QDir>
#include <QDebug>

void readXmlWithDom() {
    // 保存到文件
    QDir dir(QCoreApplication::applicationDirPath());
    QString strXmlPath = dir.absoluteFilePath("book_xml.xml");

    QFile file(strXmlPath);
    if (!file.open(QIODevice::ReadOnly)) {
        qDebug() << "Failed to open file";
        return;
    }

    QDomDocument document;
    if (!document.setContent(&file)) {
        qDebug() << "Failed to parse XML";
        file.close();
        return;
    }
    file.close();

    // 获取根节点
    QDomElement root = document.documentElement();
    if (root.tagName() != "Books") {
        qDebug() << "Invalid root element";
        return;
    }

    // 遍历所有 Book 节点
    QDomNodeList books = root.elementsByTagName("Book");
    for (int i = 0; i < books.count(); ++i) {
        QDomElement book = books.at(i).toElement();
        QString id = book.attribute("id");
        QString title = book.firstChildElement("Title").text();

        qDebug() << "Book id:" << id << ", title:" << title;
    }
}

输出结果:
在这里插入图片描述

二、使用 QXmlStreamWriter操作节点

2.1 将信息写入XML文件中

#include <QXmlStreamWriter>
void writeMultipleBooks() {
    QDir dir(QCoreApplication::applicationDirPath());
    QString strXmlPath = dir.absoluteFilePath("book_xml.xml");
    
    QFile file(strXmlPath);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
        qDebug() << "Failed to open file for writing.";
        return;
    }
    
    QXmlStreamWriter xmlWriter(&file);
    xmlWriter.setAutoFormatting(true); // 自动换行缩进
    xmlWriter.writeStartDocument();    // 写XML头部 <?xml version="1.0" encoding="UTF-8"?>
    
    xmlWriter.writeStartElement("Books"); // <Books>
    
    // 写多个<Book>子节点
    for (int i = 1; i <= 3; ++i) {
        xmlWriter.writeStartElement("Book");         // <Book>
        xmlWriter.writeAttribute("id", QString::number(i)); // 添加id属性
        xmlWriter.writeTextElement("Title", QString("Book Title %1").arg(i)); // 写<Title>内容
        xmlWriter.writeEndElement();                 // </Book>
    }
    
    xmlWriter.writeEndElement(); // </Books>
    xmlWriter.writeEndDocument(); // 自动结束
    
    file.close();
}

输出结果:

<?xml version="1.0" encoding="UTF-8"?>
<Books>
    <Book id="1">
        <Title>Book Title 1</Title>
    </Book>
    <Book id="2">
        <Title>Book Title 2</Title>
    </Book>
    <Book id="3">
        <Title>Book Title 3</Title>
    </Book>
</Books>

2.2 从XML文件中读取信息

#include <QXmlStreamReader>

void readMultipleBooks() {
    QDir dir(QCoreApplication::applicationDirPath());
    QString strXmlPath = dir.absoluteFilePath("book_xml.xml");

    QFile file(strXmlPath);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qDebug() << "Failed to open file.";
        return;
    }

    QXmlStreamReader xmlReader(&file);

    QString currentId;
    QString currentTitle;

    while (!xmlReader.atEnd()) {
        xmlReader.readNext();

        if (xmlReader.isStartElement()) {
            if (xmlReader.name() == "Book") {
                currentId = xmlReader.attributes().value("id").toString();
            }
            else if (xmlReader.name() == "Title") {
                currentTitle = xmlReader.readElementText();
                qDebug() << "Book ID:" << currentId << "Title:" << currentTitle;
            }
        }
    }

    if (xmlReader.hasError()) {
        qDebug() << "XML parse error:" << xmlReader.errorString();
    }

    file.close();
}

输出结果:
在这里插入图片描述
解析过程详解:

  • readNext() ➔ 读取下一个XML记号(元素开始、元素结束、文本等)
  • isStartElement() ➔ 检查是不是开始的标签 <…>
  • xmlReader.name() ➔ 得到当前节点名字
  • xmlReader.attributes().value(“xxx”) ➔ 读取节点的属性,比如 <Book id=“1”>
  • xmlReader.readElementText() ➔ 读取节点内的文本,比如 <Title>xxx

三、总结

QDomDocument 和 QXmlStreamWriter/Reader 的最大区别在于:
在这里插入图片描述
举个具体场景对比
用 QDomDocument ➔ 适合做:

  • 需要随时修改某个节点
  • 比如:读取配置文件,动态增加配置项,保存回去
  • 编辑复杂XML(像HTML编辑器)

用 QXmlStreamReader/Writer ➔ 适合做:

  • 只需要快速读一遍提取数据
  • 需要生成超大XML(比如100MB+的数据导出)
  • 不需要修改,只需要一条条处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值