qt QXmlStreamReader遞歸讀取xml

#ifndef XMLSTREAMREADER_H
#define XMLSTREAMREADER_H
#include <vector>
#include <QXmlStreamReader>

class XMLStreamReader
{
public:
    XMLStreamReader();
    bool readFile(const QString &fileName);

private:
          void readBookindexElement();
          void readEntryElement();
          void readPageElement();
          void skipUnknownElement();

public:
          QXmlStreamReader reader;
          std::vector<QString> vec;
};

#endif // XMLSTREAMREADER_H
#include "xmlstreamreader.h"
#include <QFile>
#include <QDebug>


XMLStreamReader::XMLStreamReader()
{

}

bool XMLStreamReader::readFile(const QString &fileName)
{
    QFile file(fileName);
    if(!file.open(QFile::ReadOnly | QFile::Text))
    {
        qDebug()<<"Open XML file Error";
        return false;
    }

    reader.setDevice(&file);
    while(!reader.atEnd())
    {
        if(reader.isStartElement())
        {
            if(reader.name() == "FY4Config")
            {
                readBookindexElement();
            }
            else
            {
                Q_ASSERT(reader.isStartElement() && (reader.name() == "FY4Config")); //斷言
                reader.raiseError(QObject::tr("Not a BookIndex file"));
            }
        }
        else
        {
            reader.readNext();
        }
    }

    file.close();
    if(reader.hasError())
    {
        qDebug()<<reader.errorString();
        return false;
    }
    else if(file.error() != QFile::NoError)
    {
        qDebug()<<file.errorString();
        return false;
    }

    return true;
}

void XMLStreamReader::readBookindexElement()
{
    reader.readNext();
    while(!reader.atEnd())
    {
        if(reader.isStartElement())
        {
            if(reader.name() == "TimeIntervalList")
            {
                 readEntryElement();
            }
        }
        else
        {
            reader.readNext();
        }
    }
}

void XMLStreamReader::readEntryElement()
{
    reader.readNext();
    while(!reader.atEnd())
    {
        if(reader.isEndElement())
        {
            reader.readNext();
            break;
        }

        if(reader.isStartElement())
        {
            if(reader.name() == "Time")
            {
                readPageElement();
            }
        }
        else
        {
            reader.readNext();
        }
    }
}

void XMLStreamReader::readPageElement()
{
    QString page = reader.readElementText();
    if(reader.isEndElement())
        reader.readNext();
    vec.push_back(page);

}

void XMLStreamReader::skipUnknownElement()
{
    reader.readNext();
    while(!reader.atEnd())
    {
        if(reader.isEndElement())
        {
            reader.readNext();
            break;
        }

        if(reader.isStartElement())
        {
            skipUnknownElement();
        }
        else
        {
            reader.readNext();
        }
    }
}
#include <QCoreApplication>
#include "xmlstreamreader.h"
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    XMLStreamReader reader;
    reader.readFile("E:/project/untitled/TimeIntervalList.xml");
    for(int i = 0; i < reader.vec.size(); i++)
    {
        qDebug() << i << reader.vec.at(i);
    }
    return a.exec();
}

<?xml version="1.0" encoding="UTF-8"?>
<FY4Config>
  <TimeIntervalList>
	  <Time>0.1</Time>
	  <Time>0.2</Time>
	  <Time>0.3</Time>
	  <Time>0.4</Time>
	  <Time>0.5</Time>
	  <Time>0.6</Time>
	  <Time>0.7</Time>
	  <Time>0.8</Time>
	  <Time>0.9</Time>
	  <Time>0.10</Time>
	  <Time>0.11</Time>
	  <Time>0.12</Time>
	  <Time>0.13</Time>
	  <Time>0.14</Time>
  </TimeIntervalList>
</FY4Config>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章