QT开发之XML(SAX接口)

上篇文章提到了DOM接口,这篇文章我们来实践SAX接口.SAX为XML解析器提供了一个基于事件的标准接口.在Qt中支持SAX2,但是不支持Java接口中的SAX1.SAX接口是一个驱动机制,Qt中有一个类是QXmlDefaultHandler,它提供了startElement事件处理函数,character()事件处理函数,endElement(),fatalError事件处理函数,更多的事件可以查看QtAssistant帮助文档,在Qt Creator中直接按F1就可以快速查看.


遇到开始标签会调用startElement()事件处理函数.

发现字符数据会调用character()事件处理函数.

一个结束标签被解析会调用endElement()事件处理函数.


新建Qt项目,名称为mySAX.   在mySAX.pro中添加 QT  +=xml


main.cpp

#include "mysax.h"
#include <QApplication>

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    MySAX sax;
    sax.readFile("./my.xml");
    return app.exec();
}


mysax.h

#ifndef MYSAX_H
#define MYSAX_H

#include <QXmlDefaultHandler>
class QListWidget;

class MySAX : public QXmlDefaultHandler
{
public:
    MySAX();
    ~MySAX();
    bool readFile(const QString &fileName);
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 fatalError(const QXmlParseException &exception);

private:
    QListWidget *list;
    QString currentText;
};

#endif // MYSAX_H

mysax.cpp

#include "mysax.h"
#include <QtXml>
#include <QListWidget>

MySAX::MySAX()
{
    list = new QListWidget;
    list->show();
}

MySAX::~MySAX()
{
    delete list;
}

bool MySAX::readFile(const QString &fileName)
{
    QFile file(fileName);

    QXmlInputSource inputSource(&file);

    QXmlSimpleReader reader;

    reader.setContentHandler(this);

    reader.setErrorHandler(this);

    return reader.parse(inputSource);
}


bool MySAX::startElement(const QString &namespaceURI, const QString &localName,
                         const QString &qName, const QXmlAttributes &atts)
{
    if (qName == "library")
        list->addItem(qName);
    else if (qName == "book")
        list->addItem("    " + qName + atts.value("id"));
    return true;
}


bool MySAX::characters(const QString &ch)
{
    currentText = ch;
    return true;
}

bool MySAX::endElement(const QString &namespaceURI, const QString &localName,
                       const QString &qName)
{
    if (qName == "title" || qName == "author")
        list->addItem("        " + qName + " : " + currentText);
    return true;
}

bool MySAX::fatalError(const QXmlParseException &exception)
{
    qDebug() << exception.message();
    return false;
}

运行效果如下:



已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页