Parsing Xml in Qt

Posted by k0il inside On Thursday, October 6, 2011 0 komentar
Setelah beberapa jam otak atik Qt Creator,.. akhirnya ketemu juga gimana caranya memparse xml dengan Qt

sebenarnya saya di sini menggunakan cara,... pertama  file URL dibaca terlebih dahulu,.. kemudian file tersebut di parse... karna di sini saya menggunakan file yang online atau file yang di akses dari web maka saya menggunakan QNetworkAccessManager tetapi jika file xmlnya ada di komputer local ,.. maka tidak perlu menggunakan QNetworkAccessManager cukup memanggil filenya saja ,..  refrensi untuk NetworkAccessManager dapat di lihat di sini http://doc.trolltech.com/4.5/qnetworkaccessmanager.html
Ok langsung saya ke Cuplikan Source Codenya seperti dibawah ini :
QT += network xml
Karna Saya Menggunakan QNetworkAccessManager maka saya menambahkan perintah tersebut pada file .pro nya


#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtXml/QXmlStreamReader>
#include <QNetworkReply>
#include <QStandardItemModel>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void mainkan();
    void pareseXml();

public slots:
    void replyFinished(QNetworkReply*);

private:
    Ui::MainWindow *ui;
    QXmlStreamReader xml;
    void parsePerson(QXmlStreamReader& reader);
    QStandardItemModel *mModel;

};

#endif // MAINWINDOW_H
Source Code .h


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QDebug"
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include "QMessageBox"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    mainkan();
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::mainkan()
{
    this->mModel = new QStandardItemModel(0, 3, this);

     mModel->setHeaderData(0, Qt::Horizontal, QObject::tr("Firsname"));
     mModel->setHeaderData(1, Qt::Horizontal, QObject::tr("Surname"));
     mModel->setHeaderData(2, Qt::Horizontal, QObject::tr("Number"));
     ui->tableView->setModel(mModel);
     ui->tableView->setAlternatingRowColors(true);
     ui->tableView->show();

    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)),
            this, SLOT(replyFinished(QNetworkReply*)));

    manager->get(QNetworkRequest(QUrl("http://localhost/h2h/mainAPP.php")));
}

void MainWindow::replyFinished(QNetworkReply *pReply)
{
    QByteArray data=pReply->readAll();
    xml.addData(data);
    pareseXml();
    //qDebug()<<QString(data);

}
void MainWindow::pareseXml()
{
    QList< QMap<QString,QString> > persons;
    while(!xml.atEnd() &&
          !xml.hasError()) {
            QXmlStreamReader::TokenType token = xml.readNext();
            if(token == QXmlStreamReader::StartDocument) {
                    continue;
            }
            if(token == QXmlStreamReader::StartElement) {
                    if(xml.name() == "persons") {
                            continue;
                    }
                    if(xml.name() == "person")
                    {
                            this->parsePerson(xml);
                    }
            }
    }
    if(xml.hasError()) {
            QMessageBox::critical(this,
                                  "QXSRExample::parseXML",
                                  xml.errorString(),
                                  QMessageBox::Ok);
    }
    xml.clear();
}
void MainWindow::parsePerson(QXmlStreamReader& xml)
{
        while (!xml.atEnd())
        {

                if (xml.isStartElement() && xml.name() == "person")
                {
                        QXmlStreamAttributes attrs = xml.attributes();

                        QStringRef fName = attrs.value("firstname");
                        QStringRef sName = attrs.value("surname");
                        QStringRef pNumber = attrs.value("number");

                          if (fName.isEmpty())
                                  {
                                  xml.readNext();
                                  continue;
                                  }
                          mModel->insertRow(0);
                          //qDebug()<<fName.toString();
                          mModel->setData(mModel->index(0, 0),fName.toString());
                          mModel->setData(mModel->index(0, 1),sName.toString());
                          mModel->setData(mModel->index(0, 2),pNumber.toString());
                }
                else if(xml.isEndElement() && xml.name() == "persons")
                {
                       return;
                }
                xml.readNext();
        }
}
Source code .cpp

Atau Source Lengkapnya bisa di download di sini

0 komentar:

Post a Comment