QT中使用QXmlStreamReader解析XML文件

转载请注明链接与作者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(); } main.cpp

#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来进行解析,因而所有的节点都需要自己编写函数进行相应的处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值