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;
        }
    }
}

输出结果:

相关推荐
Quz19 小时前
QML TextField 应用:自动关联与表单提交
qt
sycmancia21 小时前
Qt——自定义控件温度计
开发语言·qt
艾莉丝努力练剑1 天前
【Qt:问题解决】Qt程序入口点错误修复:MinGW ABI兼容问题
java·服务器·开发语言·qt·文件系统·动静态库
邱邱玩编程1 天前
读取位置 0x0000000000000000 时发生访问冲突 | QT | MFC
c++·qt·visualstudio
我是小灰灰吖1 天前
QT在线安装器使用指南:从下载到配置完整教程
linux·qt·ubuntu
C++ 老炮儿的技术栈2 天前
从 Qt Designer 属性编辑器的层级可以看到继承链
c语言·数据库·c++·qt·sqlite·visual studio
我是小灰灰吖2 天前
Ubuntu 22.04 + Qt 6.9.3 应用程序打包与部署完整指南
qt·ubuntu
qq_401700412 天前
Qt自定义信号槽详解:带参发射 vs sender()获取,两种多信号关联方案全掌握
java·数据库·qt
郝学胜-神的一滴2 天前
Qt 高级编程 042:进度条从入门到自定义美化
开发语言·c++·qt·软件开发·用户界面
AI的探索之旅2 天前
嵌入式视觉学习路线:Qt + OpenCV + 工业相机,从零到综合项目
qt·opencv·学习