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

输出结果:

相关推荐
IT阳晨。2 小时前
【QT开发】交叉编译QT程序在ARMLinux平台上运行
c++·qt·交叉编译·armlinux·代码移植
byxdaz5 小时前
Qt中日期/时间/时区类 (QDate, QTime, QDateTime,QTimeZone)
qt·时间·时区
紫荆鱼7 小时前
PCL实战项目-软件界面搭建RibbonUI
qt·pcl·用户界面·qml·点云处理
27399202910 小时前
qInstallMessageHandler(重定向至log文件)
开发语言·qt
火山上的企鹅1 天前
Qt C++ 软件开发工程师面试题
c++·qt·面试
Industio_触觉智能1 天前
开源鸿蒙SIG-Qt技术沙龙成都站成功举办,产品方案展示
qt·harmonyos·openharmony·开源鸿蒙·sig-qt
上去我就QWER1 天前
深入解析Qt中的QDrag:实现灵活的拖放交互
c++·qt
奔跑吧 android1 天前
【瑞芯微】【rk3128】【移植 qt 5.12.9】
qt·arm·瑞芯微·rk3128
A.A呐2 天前
【QT第三章】常用控件1
开发语言·c++·笔记·qt
CodeKwang2 天前
Qt实战:自定义搜索跳转控件 | 附完整源码
qt·qt控件