Qt中XML文件创建及解析

一 环境部署

QT的配置文件中添加xml选项:

二 写入xml文件

头文件:#include <QXmlStreamWriter>

javascript 复制代码
bool MyXML::writeToXMLFile()
{
    QString currentTime = QDateTime::currentDateTime().toString("yyyyMMddhhmmss");
    QString fileName = "./testWrite.xml";
    QFile file(fileName);
    //QIODevice::Truncate 以重写的方式打开,在写入新的数据时会将原有数据全部清除
    if(!file.open(QIODevice::WriteOnly | QIODevice::Text |QIODevice::Truncate)){
        qDebug()<<"open xml file failed!";
        return false;
    }


    QXmlStreamWriter write(&file);
    //设置自动格式化,包括自动换行缩进等
    write.setAutoFormatting(true);
    write.writeStartDocument("1.0");

    //写入常规信息
    write.writeStartElement("SomebodyInfo");
    write.writeTextElement("name","abby");
    write.writeTextElement("age",QString::number(18));
    write.writeTextElement("sex","girl");

    //写入数组
    for(int i = 0; i < 2; i++){
        write.writeStartElement("hobby");
        write.writeAttribute("No",QString::number(i));
        write.writeTextElement("name",QString("piano").append(QString::number(i)));
        write.writeEndElement();
    }
    write.writeEndElement();

    write.writeEndDocument();
    file.close();
    return true;
}
写入的文件如图:

三 解析xml文件

头文件:#include <QXmlStreamReader>

javascript 复制代码
bool MyXML::parseXMLFile()
{
    QString fileName = "./testWrite.xml";
    QFile file(fileName);
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){
        qDebug()<<"open xml file failed!";
        return false;
    }

    QXmlStreamReader reader(&file);
    //过滤首行
    reader.readNext();
    while(!reader.atEnd()){
        reader.readNext();
        if(reader.isStartElement()){
            if(reader.name() == "name"){
                qDebug()<<"name = "<<reader.readElementText();
            }
            else if(reader.name() == "age"){
                qDebug()<<"age = "<<reader.readElementText();
            }
            else if(reader.name() == "sex"){
                qDebug()<<"sex = "<<reader.readElementText();
            }
            else if(reader.name() == "hobby"){
                parseHobby(reader);
            }
        }
        else if(reader.isEndElement()){
            break;
        }
    }
}

解析其中的Hobby模块:

javascript 复制代码
bool MyXML::parseHobby(QXmlStreamReader &reader)
{
    QVector<QString> hobbyVec;
    QString hobby;
    while(!reader.atEnd()){
        reader.readNext();
        if(reader.isStartElement()){
            if(reader.name() == "name"){
                hobby = reader.readElementText();
                hobbyVec.push_back(hobby);
            }
        }
        else if(reader.isEndElement()){
            for(int i = 0; i < hobbyVec.size();i++){
                 qDebug()<<"hobby i= "<<QString::number(i)<<"name = "<<hobbyVec[i];
            }
            break;
        }
    }
}

输出结果:

相关推荐
小短腿的代码世界10 小时前
Qt实时盈亏计算深度解析:从持仓数据到动态盈亏展示
开发语言·qt
Python私教11 小时前
GenericAgent PySide6 桌面应用深度解析:悬浮按钮 + 聊天面板的原生 Qt 方案
开发语言·数据库·qt
用户8055336980311 小时前
现代Qt开发教程(新手篇)1.11——定时器
c++·qt
小短腿的代码世界14 小时前
Qt券商接口封装深度解析:统一API设计与多源适配
开发语言·qt·单元测试
T0uken14 小时前
基于 vcpkg 与 LLVM-MinGW 的 Qt6 静态链接开发方案
c++·windows·qt
Ulyanov14 小时前
《现代 Python 桌面应用架构实战:PySide6 + QML 从入门到工程化》 开发环境搭建与工具链极简主义 —— 拒绝臃肿,构建工业级基座
开发语言·python·qt·ui·架构·系统仿真
(Charon)19 小时前
【C++/Qt】Qt 实现 MQTT 测试工具:连接 Broker、订阅主题与发布消息
开发语言·c++·qt
Ulyanov19 小时前
《现代 Python 桌面应用架构实战:PySide6 + QML 从入门到工程化》:动态数据仪表盘与 NumPy 可视化 —— 从标量到向量的数据驱动进化
开发语言·python·qt·架构·numpy
小短腿的代码世界19 小时前
Qt序列化与持久化深度解析:从QDataStream到自定义二进制协议
开发语言·数据库·qt
誰能久伴不乏19 小时前
Qt/C++ 架构之美:用一个“水龙头”隐喻,讲透面向接口编程与彻底解耦
c++·qt·架构