giovedì 24 gennaio 2013

Leggere XML/KML con Qt

Lo scopo di questo programma e' estrarre i valori di latitudine e longitudine da un file kml (Google Earth) popolato di placemarks

Per prima cosa una precisazione: esistono due modi per creare file xml, nella prima il tag contiene l'informazione mentre nella seconda l'informazione e' racchiusa tra i tag

per esempio
caso 1 : <tag id="0"/>
caso 2 : <id>0</tag>

Caso 1

Caso 2 (KML)

Il secondo caso corriponde a come sono formati i file xml per esempio dei servizi RSS e di Google Earth
Il motivo di questa precisazione risiede nel fatto che il metodo di lettura non e' valido per tutti i formati
Il tutorial di http://www.voidrealms.com (tutorial Qt 95) non interpreta correttamente il formato 2

kml.pro (importante modificare il file di progetto perche' si usa la libreria QtXml che non e' normalmente linkata)
-----------------------------------
#-------------------------------------------------
#
# Project created by QtCreator 2013-01-23T10:12:21
#
#-------------------------------------------------

QT       += core
QT       += xml



TARGET = untitled
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app


SOURCES += main.cpp
--------------------------

main.cpp
--------------------------
#include <QtCore>
#include <QtXml>
#include <QDebug>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QString filename("C:/Casa.kml");
        QTextStream cout(stdout);
        QFile file(filename);
        bool open = file.open(QIODevice::ReadOnly | QIODevice::Text);
        if (!open)
        {
            cout << "Couldn't open file" << endl;
            return 1;
        }
        else
        {
            cout << "File opened OK" << endl;
       }
    QXmlStreamReader xml(&file);
    qDebug() << "Encoding: " << xml.documentEncoding().toString() << endl;
        while (!xml.atEnd() && !xml.hasError())
        {
            xml.readNext();
            if (xml.isStartElement())
            {
                QString name = xml.name().toString();
                if ((name=="longitude") || (name == "latitude"))
                {
                    qDebug() << "element name: '" << xml.name().toString() << "'" << ", text: '" << xml.readElementText() << "'" << endl;
                }
            }
            else if (xml.hasError())
            {
                qDebug() << "XML error: " << xml.errorString() << endl;
            }
            else if (xml.atEnd())
            {
                qDebug() << "Reached end, done" << endl;
            }
        }
    return a.exec();
}
--------------------------