giovedì 21 gennaio 2016

Leggere file XML in Qt

Avevo necessita' di leggere un file xml generato da una mia applicazione mobile e dovendo scrivere un lettore multipiattaforma la mia scelta e' caduta su Qt

Questo e' il file da leggere
----------------------------
<?xml version="1.0" encoding="UTF-8"?>
<frane>
<frana id="1">
<localita>Pino Torinese</localita>
<comune>Torino</comune>
<data>19/01/2016</data>
<ora>1:45 pm</ora>
<compilatore>Luca Innocenti</compilatore>
<annotazioni></annotazioni>
<est></est>
<nord></nord>
<sistema>WGS84</sistema>
<A>4</A>
<EE>1</EE>
<H>2</H>
<ALPHA>3</ALPHA>
<F>2</F>
<V>4</V>
<M>2</M>
<codice>3/<codice>
</frana>
</frane>
----------------------------

e questo e' lo scheletro del codice Qt (piuttosto autoesplicativo). Prima si carica il file come xmlBOM e poi lo di scorre cercando le varie chiavi
Per la compilazione e' necessario aggiungere al progetto
Qt = + xml

----------------------------
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <iostream>
#include <QtXml>
#include <QFile>

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

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
     QDomDocument xmlBOM;
     QFile f("/Users/lucainnocenti/Triage.xml");
     if (!f.open(QIODevice::ReadOnly ))
     {
         std::cerr << "Error while loading file" << std::endl;
     }
     xmlBOM.setContent(&f);
     f.close();


     QDomElement root=xmlBOM.documentElement();
     QDomElement Component=root.firstChild().toElement();

     while(!Component.isNull())
     {
         if (Component.tagName()=="frana")
         {
           QDomElement Child=Component.firstChild().toElement();
           QString localita,comune,data,ora,compilatore;
           int A;

             while (!Child.isNull())
             {
                 // Read Name and value
                 if (Child.tagName()=="localita") localita=Child.firstChild().toText().data();
                 if (Child.tagName()=="comune") comune=Child.firstChild().toText().data();
                 if (Child.tagName()=="data") data=Child.firstChild().toText().data();
                 if (Child.tagName()=="ora") ora=Child.firstChild().toText().data();
                 if (Child.tagName()=="compilatore") compilatore=Child.firstChild().toText().data();
                 if (Child.tagName()=="A") A=Child.firstChild().toText().data().toInt();

                 Child = Child.nextSibling().toElement();
             }
             std::cout << "Localita = " << localita.toStdString().c_str() << std::endl;
             std::cout << "Comune = " << comune.toStdString().c_str() << std::endl;
             std::cout << "Data = " << data.toStdString().c_str() << std::endl;
             std::cout << "Ora = " << ora.toStdString().c_str() << std::endl;
             std::cout << "Compilatore = " << compilatore.toStdString().c_str() << std::endl;
             std::cout << "A = " << localita.toStdString().c_str() << std::endl;
             std::cout << std::endl;
             ui->label->setText(comune);
         }
         Component = Component.nextSibling().toElement();
     }
}
----------------------------