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

输出结果:

相关推荐
大可门耳2 分钟前
Qt第一课:Qt是什么?相对于其他框架的优劣势是什么
开发语言·qt
axban3 小时前
QT M/V架构开发实战:QFileSystemModel介绍
开发语言·qt·架构
another heaven8 小时前
【Qt VS2022调试时无法查看QString等Qt变量信息】解决方法
开发语言·qt
axban9 小时前
QT M/V架构开发实战:QStringListModel介绍
开发语言·数据库·qt
doll ~CJ10 小时前
基于QVTKOpenGLNativeWidget的三维点云可视化实现
c++·qt·软件开发·三维点云可视化
axban14 小时前
QT M/V架构开发实战:M/V架构的初步认识
开发语言·数据库·qt
大可门耳15 小时前
Qt的数据库模块介绍,Qt访问SQLite详细示例
数据库·qt·sqlite
axban16 小时前
QT M/V架构开发实战:QAbstractItemModel介绍
java·数据库·qt
草丛中的蝈蝈17 小时前
qt中给QListWidget添加上下文菜单(快捷菜单)
开发语言·qt
大可门耳21 小时前
qt调用cef的Demo,实现js与C++之间的交互细节
javascript·c++·经验分享·qt