轉載請註明鏈接與作者huihui1988
XML文件由於其擴展性與兼容性的優點,被廣泛用作軟件和系統的配置文件。這裏簡要介紹一下QT下如何來解析XML文件。
源代碼:
xml_reader.h
- #ifndef XML_READER_H
- #define XML_READER_H
- #include <QtCore>
- //#include <QtGui>
- class xml_reader : public QXmlStreamReader
- {
- //Q_OBJECT
- public:
- xml_reader();
- bool read(QIODevice *device);
- private:
- void read_data();
- void read_startweek();
- void read_eventnumber();
- void read_period();
- void read_id();
- void read_starttime();
- void read_endtime();
- void read_exception();
- void read_subexception();
- void read_description();
- void read_duration();
- void read_event();
- void read_offsettime();
- void read_eventdesc();
- void read_eventname();
- void read_prompt();
- void read_lasthandle();
- void read_unknow();
- };
- #endif // XML_READER_H
xml_reader.cpp
- #include "xml_reader.h"
- xml_reader::xml_reader()
- {}
- bool xml_reader::read(QIODevice *device)
- {
- setDevice(device);
- while(!atEnd())
- {
- readNext();
- if(isStartElement())
- {
- if(name() == "data")
- {
- read_data();
- }
- }
- }
- return !error();
- }
- void xml_reader::read_data()
- {
- qDebug()<<"Start to read data...";
- while(!atEnd())
- {
- readNext();
- if(isStartElement())
- {
- if(name() == "period")
- {
- read_period();
- }
- if(name() == "startweek")
- {
- read_startweek();
- }
- if(name() == "eventnumber")
- {
- read_eventnumber();
- }
- }
- if(isEndElement())
- {
- if(name() == "data")
- {
- qDebug()<<"Now at the end of data element...";
- break;
- }
- }
- }
- }
- void xml_reader::read_startweek()
- {
- qDebug()<<"startweek is: "<<readElementText();
- }
- void xml_reader::read_eventnumber()
- {
- qDebug()<<"eventNumber is: "<<readElementText();
- }
- void xml_reader::read_period()
- {
- qDebug()<<"Start to read period...";
- while(!atEnd())
- {
- readNext();
- if(isStartElement())
- {
- if(name() == "id")
- {
- read_id();
- }
- if(name() == "starttime")
- {
- read_starttime();
- }
- if(name() == "endtime")
- {
- read_endtime();
- }
- if(name() == "exception")
- {
- read_exception();
- }
- if(name() == "duration")
- {
- read_duration();
- }
- if(name() == "event")
- {
- read_event();
- }
- }
- if(isEndElement())
- {
- if(name() == "period")
- {
- qDebug()<<"Now at the end of period...";
- break;
- }
- }
- }
- }
- void xml_reader::read_id()
- {
- qDebug()<<"id is: " << readElementText();
- }
- void xml_reader::read_starttime()
- {
- qDebug()<<"starttime is: " << readElementText();
- }
- void xml_reader::read_endtime()
- {
- qDebug()<<"endtime is: " << readElementText();
- }
- void xml_reader::read_exception()
- {
- qDebug()<<"Start to read exception...";
- while(!atEnd())
- {
- readNext();
- if(isStartElement())
- {
- if(name() == "subexception")
- {
- read_subexception();
- }
- }
- if(isEndElement())
- {
- if(name() == "exception")
- {
- qDebug()<<"Now at the end of exception...";
- break;
- }
- }
- }
- }
- void xml_reader::read_subexception()
- {
- qDebug()<<"Start to read subexception...";
- while(!atEnd())
- {
- readNext();
- if(isStartElement())
- {
- if(name() == "id")
- {
- read_id();
- }
- if(name() == "starttime")
- {
- read_starttime();
- }
- if(name() == "endtime")
- {
- read_endtime();
- }
- if(name() == "description")
- {
- read_description();
- }
- }
- if(isEndElement())
- {
- if(name() == "subexception")
- {
- qDebug()<<"Now at the end of subexception...";
- break;
- }
- }
- }
- }
- void xml_reader::read_description()
- {
- qDebug()<<"description is: " << readElementText();
- }
- void xml_reader::read_duration()
- {
- qDebug()<<"duration is: " << readElementText();
- }
- void xml_reader::read_event()
- {
- qDebug()<<"Start to read event...";
- while(!atEnd())
- {
- readNext();
- if(isStartElement())
- {
- if(name() == "id")
- {
- read_id();
- }
- if(name() == "offsettime")
- {
- read_offsettime();
- }
- if(name() == "eventdesc")
- {
- read_eventdesc();
- }
- if(name() == "lasthandle")
- {
- read_lasthandle();
- }
- }
- if(isEndElement())
- {
- if(name() == "event")
- {
- qDebug()<<"Now at the end of event..";
- break;
- }
- }
- }
- }
- void xml_reader::read_offsettime()
- {
- qDebug()<<"offsettime is: " << readElementText();
- }
- void xml_reader::read_eventdesc()
- {
- qDebug()<<"Start to read eventdesc...";
- while(!atEnd())
- {
- readNext();
- if(isStartElement())
- {
- if(name() == "eventname")
- {
- read_eventname();
- }
- if(name() == "prompt")
- {
- read_prompt();
- }
- }
- if(isEndElement())
- {
- if(name() == "eventdesc")
- {
- qDebug()<<"Now at the end of eventdesc...";
- break;
- }
- }
- }
- }
- void xml_reader::read_eventname()
- {
- qDebug()<<"eventname is: " << readElementText();
- }
- void xml_reader::read_prompt()
- {
- qDebug()<<"prompt is: " << readElementText();
- }
- void xml_reader::read_lasthandle()
- {
- qDebug()<<"lasthandle is: " << readElementText();
- }
- #include <QtCore/QCoreApplication>
- #include "XmlPraser.h"
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- QFile file("praser.xml");
- XmlPraser reader;
- if(file.open(QIODevice::ReadOnly | QIODevice::Text))
- {
- qDebug()<<"File has loaded...";
- reader.read(&file);
- }
- else
- {
- qDebug()<<"No file to read...";
- }
- file.close();
- qDebug()<<"Press ctrl+C to exit...";
- return a.exec();
- }
XML文件範例 praser.xml
- <?xml version="1.0" encoding="GBK" ?>
- <data>
- <startweek>2010-03-01 00:00:00.000</startweek>
- <eventnumber>2</eventnumber>
- <period>
- <id>223401</id>
- <starttime>2010-03-01 00:00:00.000</starttime>
- <endtime>2010-06-20 23:59:59.999</endtime>
- <exception>
- <subexception>
- <id>01</id>
- <starttime>2010-04-03 00:00:00.000</starttime>
- <endtime>2010-04-05 23:59:59.000</endtime>
- <description>清明節放假三天</description>
- </subexception>
- <subexception>
- <id>02</id>
- <starttime>2010-05-01 00:00:00.000</starttime>
- <endtime>2010-05-03 23:59:59.000</endtime>
- <description>五一勞動節放假三天</description>
- </subexception>
- </exception>
- <duration>0000-00-07 00:00:00.000</duration>
- <event>
- <id>01</id>
- <offsettime>0000-00-00 14:00:00.000</offsettime>
- <eventdesc>
- <eventname>編譯原理</eventname>
- <prompt>ring</prompt>
- </eventdesc>
- <lasthandle>null</lasthandle>
- </event>
- <event>
- <id>02</id>
- <offsettime>0000-00-03 09:50:00.000</offsettime>
- <eventdesc>
- <eventname>編譯原理</eventname>
- <prompt>vibration</prompt>
- </eventdesc>
- <lasthandle>null</lasthandle>
- </event>
- </period>
- </data>
由於是使用的QXmlStrramReader來進行解析,因而所有的節點都需要自己編寫函數進行相應的處理。