XML文件由于其扩展性与兼容性的优点,被广泛用作软件和系统的配置文件。这里简要介绍一下QT下如何来解析XML文件。
源代码:
xml_reader.h
- #ifndefXML_READER_H
- #defineXML_READER_H
- #include<QtCore>
- //#include<QtGui>
- classxml_reader:publicQXmlStreamReader
- {
- //Q_OBJECT
- public:
- xml_reader();
- boolread(QIODevice*device);
- private:
- voidread_data();
- voidread_startweek();
- voidread_eventnumber();
- voidread_period();
- voidread_id();
- voidread_starttime();
- voidread_endtime();
- voidread_exception();
- voidread_subexception();
- voidread_description();
- voidread_duration();
- voidread_event();
- voidread_offsettime();
- voidread_eventdesc();
- voidread_eventname();
- voidread_prompt();
- voidread_lasthandle();
- voidread_unknow();
- };
- #endif//XML_READER_H
xml_reader.cpp
- #include"xml_reader.h"
- xml_reader::xml_reader()
- {}
- boolxml_reader::read(QIODevice*device)
- {
- setDevice(device);
- while(!atEnd())
- {
- readNext();
- if(isStartElement())
- {
- if(name()=="data")
- {
- read_data();
- }
- }
- }
- return!error();
- }
- voidxml_reader::read_data()
- {
- qDebug()<<"Starttoreaddata...";
- 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()<<"Nowattheendofdataelement...";
- break;
- }
- }
- }
- }
- voidxml_reader::read_startweek()
- {
- qDebug()<<"startweekis:"<<readElementText();
- }
- voidxml_reader::read_eventnumber()
- {
- qDebug()<<"eventNumberis:"<<readElementText();
- }
- voidxml_reader::read_period()
- {
- qDebug()<<"Starttoreadperiod...";
- 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()<<"Nowattheendofperiod...";
- break;
- }
- }
- }
- }
- voidxml_reader::read_id()
- {
- qDebug()<<"idis:"<<readElementText();
- }
- voidxml_reader::read_starttime()
- {
- qDebug()<<"starttimeis:"<<readElementText();
- }
- voidxml_reader::read_endtime()
- {
- qDebug()<<"endtimeis:"<<readElementText();
- }
- voidxml_reader::read_exception()
- {
- qDebug()<<"Starttoreadexception...";
- while(!atEnd())
- {
- readNext();
- if(isStartElement())
- {
- if(name()=="subexception")
- {
- read_subexception();
- }
- }
- if(isEndElement())
- {
- if(name()=="exception")
- {
- qDebug()<<"Nowattheendofexception...";
- break;
- }
- }
- }
- }
- voidxml_reader::read_subexception()
- {
- qDebug()<<"Starttoreadsubexception...";
- 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()<<"Nowattheendofsubexception...";
- break;
- }
- }
- }
- }
- voidxml_reader::read_description()
- {
- qDebug()<<"descriptionis:"<<readElementText();
- }
- voidxml_reader::read_duration()
- {
- qDebug()<<"durationis:"<<readElementText();
- }
- voidxml_reader::read_event()
- {
- qDebug()<<"Starttoreadevent...";
- 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()<<"Nowattheendofevent..";
- break;
- }
- }
- }
- }
- voidxml_reader::read_offsettime()
- {
- qDebug()<<"offsettimeis:"<<readElementText();
- }
- voidxml_reader::read_eventdesc()
- {
- qDebug()<<"Starttoreadeventdesc...";
- while(!atEnd())
- {
- readNext();
- if(isStartElement())
- {
- if(name()=="eventname")
- {
- read_eventname();
- }
- if(name()=="prompt")
- {
- read_prompt();
- }
- }
- if(isEndElement())
- {
- if(name()=="eventdesc")
- {
- qDebug()<<"Nowattheendofeventdesc...";
- break;
- }
- }
- }
- }
- voidxml_reader::read_eventname()
- {
- qDebug()<<"eventnameis:"<<readElementText();
- }
- voidxml_reader::read_prompt()
- {
- qDebug()<<"promptis:"<<readElementText();
- }
- voidxml_reader::read_lasthandle()
- {
- qDebug()<<"lasthandleis:"<<readElementText();
- }
main.cpp
- #include<QtCore/QCoreApplication>
- #include"xml_reader.h"
- intmain(intargc,char*argv[])
- {
- QCoreApplicationa(argc,argv);
- QFilefile("praser.xml");
- xml_readerreader;
- if(file.open(QIODevice::ReadOnly|QIODevice::Text))
- {
- qDebug()<<"Filehasloaded...";
- reader.read(&file);
- }
- else
- {
- qDebug()<<"Nofiletoread...";
- }
- file.close();
- qDebug()<<"Pressctrl+Ctoexit...";
- returna.exec();
- }
XML文件范例praser.xml
- <?xmlversion="1.0"encoding="GBK"?>
- <data>
- <startweek>2010-03-0100:00:00.000</startweek>
- <eventnumber>2</eventnumber>
- <period>
- <id>223401</id>
- <starttime>2010-03-0100:00:00.000</starttime>
- <endtime>2010-06-2023:59:59.999</endtime>
- <exception>
- <subexception>
- <id>01</id>
- <starttime>2010-04-0300:00:00.000</starttime>
- <endtime>2010-04-0523:59:59.000</endtime>
- <description>清明节放假三天</description>
- </subexception>
- <subexception>
- <id>02</id>
- <starttime>2010-05-0100:00:00.000</starttime>
- <endtime>2010-05-0323:59:59.000</endtime>
- <description>五一劳动节放假三天</description>
- </subexception>
- </exception>
- <duration>0000-00-0700:00:00.000</duration>
- <event>
- <id>01</id>
- <offsettime>0000-00-0014:00:00.000</offsettime>
- <eventdesc>
- <eventname>编译原理</eventname>
- <prompt>ring</prompt>
- </eventdesc>
- <lasthandle>null</lasthandle>
- </event>
- <event>
- <id>02</id>
- <offsettime>0000-00-0309:50:00.000</offsettime>
- <eventdesc>
- <eventname>编译原理</eventname>
- <prompt>vibration</prompt>
- </eventdesc>
- <lasthandle>null</lasthandle>
- </event>
- </period>
- </data>
由于是使用的QXmlStrramReader来进行解析,因而所有的节点都需要自己编写函数进行相应的处理。