Qt工作笔记-对QXmlStreamReader的进一步认识(读取XML)

时间:2021-10-14 04:08:33

代码如下:

#include <QApplication>
#include <QDebug>
#include <QFile>
#include <QVector>
#include <QXmlStreamReader>

typedef struct SystemData{
    QString nameStr1;
    QString nameStr2;
    QString nameStr3;
    QString nameStr4;
    QString nameStr5;
    double dataDouble;
    int dataInt1=-1;
    int dataInt2=-1;
    int dataInt3=-1;
}SystemData;

typedef QVector<SystemData*> SystemVec;



int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QFile file("E:\\Qt2018\\ReadXMLLastDemo\\my.xml");
    if(!file.open(QFile::ReadOnly|QFile::Text)){
        qDebug()<<"读取XML文件时,文件打开失败";
        return false;
    }
    QXmlStreamReader reader;
    reader.setDevice(&file);

    int Count=0;
    SystemVec systemVec;

    SystemData *tempSysData=new SystemData;
    while(!reader.atEnd()){
        reader.readNext();
        if(reader.name().toString()=="name1"){
            tempSysData->nameStr1=reader.readElementText();
        }
        if(reader.name().toString()=="name2")
            tempSysData->nameStr2=reader.readElementText();
        if(reader.name().toString()=="name3")
            tempSysData->nameStr3=reader.readElementText();
        if(reader.name().toString()=="name4")
            tempSysData->nameStr4=reader.readElementText();
        if(reader.name().toString()=="name5")
            tempSysData->nameStr5=reader.readElementText();
        if(reader.name().toString()=="double")
            tempSysData->dataDouble=reader.readElementText().toDouble();
        if(reader.name().toString()=="int1")
            tempSysData->dataInt1=reader.readElementText().toInt();
        if(reader.attributes().hasAttribute("include"))
            tempSysData->dataInt2=reader.attributes().value("include").toString().toInt();
        if(reader.name().toString()=="int3")
            tempSysData->dataInt3=reader.readElementText().toInt();
        if(tempSysData->dataInt3!=-1){
            Count++;
            systemVec.append(tempSysData);
            //此处无Delete,直接new,数据已经加载进m_subsystemVec中了
            tempSysData=new SystemData;
        }
    }

     file.close();
    //如果多加了一个,现在进行释放
    if(tempSysData->dataInt3!=-1){
       delete tempSysData;
    }

    return a.exec();
}

xml文件如下:

<?xml   version="1.0"   encoding="utf-8"?>
<test>
	<data1>
		<name1>你妹</name1>
		<name2>你妹妹</name2>
		<name3>你妹妹妹</name3>
		<name4>你妹妹妹妹</name4>
		<name5>你妹妹妹妹妹</name5>
		<double>3.1415</double>
		<int1>10</int1>
		<attribution include="100">
			<int3>1000</int3>
		</attribution>
	</data1>
	
	<data2>
		<name1>你姐</name1>
		<name2>你姐姐</name2>
		<name3>你姐姐姐</name3>
		<name4>你姐姐姐姐</name4>
		<name5>你姐姐姐姐姐</name5>
		<double>6.6666</double>
		<int1>66</int1>
		<attribution include="666">
			<int3>66666</int3>
		</attribution>
	</data2>
</test>

运行截图如下:

Qt工作笔记-对QXmlStreamReader的进一步认识(读取XML)