一.简介 如果要使用xml解析,需要在 pro 文件中 添加 xml模块
需要用到的类:
- QXmlInputSource:为QXmlReader子类提供输入数据。
- QXmlSimpleReader:为XML阅读器提供了一个接口。
- QXmlAttributes:提供XML属性。
- QXmlDefaultHandler:提供了所有XML处理程序类的默认实现
优点:具有占用内存少,效率高等特点。
缺点:不便于随机访问任意节点。
二.示例 sax需要的几个对象:QXmlSimpleReader、QXmlInputSource、QXmlDefaultHandler。它们的关系可以描述为:reader读取source的内容,并使用handler来解析。所以handler是我们关注的重点,我们从QXmlDefaultHandler中派生一个处理类并重写它的处理函数实现xml文件的解析。
例子:解析下面的xml文档
16
40
17
45
源码:
首先自定义的handler类,实现下面4个方法。
#ifndef WXMLHANDLER_H
#define WXMLHANDLER_H#include
#include struct People
{
QString sex;
//性别
int age;
//年龄
int height;
//身高
int weight;
//体重
QString name;
//姓名
};
class WXMLHandler : public QXmlDefaultHandler
{
public:
WXMLHandler();
protected:
bool startElement(const QString &namespaceURI, const QString &localName, const QString &qName, const QXmlAttributes &atts);
bool endElement(const QString &namespaceURI, const QString &localName, const QString &qName);
bool characters(const QString &ch);
bool error(const QXmlParseException &exception);
private:
QStringm_currentTagName;
QList m_peopleList;
People m_people;
};
#endif // WXMLHANDLER_H#include "WXMLHandler.h"
#include WXMLHandler::WXMLHandler()
{}bool WXMLHandler::startElement(const QString &namespaceURI, const QString &localName, const QString &qName, const QXmlAttributes &atts)
{
if(qName == "INFO")
{
m_people.name = atts.value("NAME");
m_people.height = atts.value("HEIGHT").toInt();
}
else if(qName == "WOMAN" || qName == "MAN")
{
m_people.sex = qName;
}
else
{
m_currentTagName = qName;
}
return true;
}bool WXMLHandler::endElement(const QString &namespaceURI, const QString &localName, const QString &qName)
{
m_currentTagName = "";
if(qName == "WOMAN" || qName == "MAN")
{
m_peopleList.append(m_people);
}
else if(qName == "People")
{
for(int i = 0;
i < m_peopleList.count();
++i)
{
People people = m_peopleList.at(i);
qDebug()<<"age = "<
调用方法:
QFile file("test.xml");
if (!file.open(QIODevice::ReadOnly))
return;
QXmlInputSource source(&file);
QXmlSimpleReader reader;
WXMLHandler handler;
reader.setContentHandler(&handler);
reader.setErrorHandler(&handler);
reader.parse(source);
【Qt基础|Qt 解析XML方式(二)SAX】
推荐阅读
- Qt基础|Qt 解析XML方式(三)流方式
- Ubuntu|Ubuntu下Qt Creator配置opencv
- Qt|windows环境下在qt中配置opencv环境
- mybatis|mybatis-config.xml 以及遇到的问题
- qt|qt 之 QSystemTrayIcon(托盘程序整个例子)
- GUI-PyQt5|python3GUI--打造一款音乐播放器By:PyQt5(附下载地址)
- GUI-PyQt5|python3GUI--历史上的今天 查看器 By:PyQt5(附源码)
- python小工具|python3GUI--打造一款时间管理工具By:PyQt5(附源码)
- GUI-PyQt5|python3GUI--疫情信息快速查看工具By:PyQt5(附源码)