XML文件由于其扩展性与兼容性的优点,被广泛用作软件和系统的配置文件。这里简要介绍一下QT下如何来解析XML文件。
源代码:
xml_reader.h
#ifndef XML_READER_H#define XML_READER_H
#include
//#include
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()<
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()<
break;
}
}
}
}
void xml_reader::read_startweek()
{
qDebug()<
}
void xml_reader::read_eventnumber()
{
qDebug()<
}
void xml_reader::read_period()
{
qDebug()<
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()<
break;
}
}
}
}
void xml_reader::read_id()
{
qDebug()<
}
void xml_reader::read_starttime()
{
qDebug()<
}
void xml_reader::read_endtime()
{
qDebug()<
}
void xml_reader::read_exception()
{
qDebug()<
while(!atEnd())
{
readNext();
if(isStartElement())
{
if(name() == "subexception")
{
read_subexception();
}
}
if(isEndElement())
{
if(name() == "exception")
{
qDebug()<
break;
}
}
}
}
void xml_reader::read_subexception()
{
qDebug()<
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()<
break;
}
}
}
}
void xml_reader::read_description()
{
qDebug()<
}
void xml_reader::read_duration()
{
qDebug()<
}
void xml_reader::read_event()
{
qDebug()<
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()<
break;
}
}
}
}
void xml_reader::read_offsettime()
{
qDebug()<
}
void xml_reader::read_eventdesc()
{
qDebug()<
while(!atEnd())
{
readNext();
if(isStartElement())
{
if(name() == "eventname")
{
read_eventname();
}
if(name() == "prompt")
{
read_prompt();
}
}
if(isEndElement())
{
if(name() == "eventdesc")
{
qDebug()<
break;
}
}
}
}
void xml_reader::read_eventname()
{
qDebug()<
}
void xml_reader::read_prompt()
{
qDebug()<
}
void xml_reader::read_lasthandle()
{
qDebug()<
}
main.cpp
#include
#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()<
reader.read(&file);
}
else
{
qDebug()<
}
file.close();
qDebug()<
return a.exec();
}
XML文件范例 praser.xml
<?xml version="1.0" encoding="GBK" ?>
2010-03-01 00:00:00.000
2
223401
2010-03-01 00:00:00.000
2010-06-20 23:59:59.999
01
2010-04-03 00:00:00.000
2010-04-05 23:59:59.000
清明节放假三天
02
2010-05-01 00:00:00.000
2010-05-03 23:59:59.000
五一劳动节放假三天
0000-00-07 00:00:00.000
01
0000-00-00 14:00:00.000
编译原理
ring
null
02
0000-00-03 09:50:00.000
编译原理
vibration
null
由于是使用的QXmlStrramReader来进行解析,因而所有的节点都需要自己编写函数进行相应的处理。
发现用xread.name().toString()可以把节点名读出来
要读节点中的属性怎么读出来啊?
attributes()返回的是QVector.的派生类QXmlStreamAttributes,有方法value()来返回属性值。
比如attributes().at(i).vaue("xxxx").toString()
attributes().at(i).name()