[C++]Qt - problem z plikami xml - dostęp do elementów


(Mazix2) #1

Hej, mam pewien probelm - chiałem poznać klasę QDomDocument - napisałem sobie prosty programik, żeby zobaczyc, czy dobrze wszystko zrozumiałem. Ale albo program jest zly, albo ja czegos nie rozumiem. Stworzylem sobie taki plik xml: (korzystalem z kursu internetowego)

<?xml version = '1.0' encoding = 'ISO-8859-2'?>

nazwisko="Pielech" miejsce="Gorzów Wlkp." />

nazwisko="Kaczorek" miejsce="Świnoujście" />

nazwisko="Kowalski" miejsce="Krakow" />

nazwisko="Nowak" miejsce="Poznań" />

i do tego prosty program, ktory mialaby wyswietloac tylko imie pierwszej osoby (na razie)

include

include

include

include

include

include

include

include

include

include

int main(int argc, char *argv[]){

QApplication app(argc,argv);

QFile file("kontakty.xml");

file.open( QIODevice::ReadOnly | QIODevice::Text );

QTextStream in(&file);

QString someXML = in.readAll();

file.close();

QDomDocument drzewo; //dokument

QDomElement root; // cala baza, czyli

QDomNode osoba; // osoba, czyli

QDomElement ktos; // cala osoba, czyli

root = drzewo.documentElement(); // baza

osoba = root.firstChild(); //osoba

ktos = osoba.toElement(); //konkretna osoba, pierwsza z listy

QLabel e;

e.setText(ktos.attribute("imie")); //wyswietlenie wartosci atrybutu

e.show();

return app.exec();

}

Moze mi ktos powiedziec, gdzie jest blad ? Bo juz nie wiem, czy to kod jest zly, czy ja nie do konca pojalem filozofie xml w Qt .. Chodzi mi o to, ze pomimo tego, iz wyswietla sie etykieta, nie ma na niej imienie z tegoz pliku :frowning:

-- Dodane 04.12.2009 (Pt) 19:37 --

ok, już mam. w razie problemów (chcę modyfikować i ulepszać program) pozwolę sobie pisac tutaj :wink: Jakby ktoś był zainteresowany (lub miał w przyszłości podobne problemy), to proszę:

MAIN.CPP

#include "klasa.h"

#include


int main(int argc,char** argv){

    QApplication app(argc,argv);

    klasa k;

    k.show();

    return app.exec();

}

KLASA.CPP

#include "klasa.h"

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include


klasa::klasa(){

    QGridLayout* m = new QGridLayout(this);

    pokazI= new QLineEdit(this);

    pokazI->setReadOnly(true);

    pokazN = new QLineEdit(this);

    pokazN->setReadOnly(true);

    pokazS = new QLineEdit(this);

    pokazS->setReadOnly(true);

    pokazM = new QLineEdit(this);

    pokazM->setReadOnly(true);


    imie = new QLabel(this);

    imie->setText("Imie");

    nazwisko = new QLabel(this);

    nazwisko->setText("Nazwisko");

   czyStudiuje = new QLabel(this);

   czyStudiuje->setText("Czy studiuje?");

   miasto = new QLabel(this);

   miasto->setText("Miasto");


    m->addWidget(imie,0,0);

    m->addWidget(pokazI,0,1);

    m->addWidget(nazwisko,1,0);

    m->addWidget(pokazN,1,1);

    m->addWidget(czyStudiuje,2,0);

    m->addWidget(pokazS,2,1);

    m->addWidget(miasto,3,0);

    m->addWidget(pokazM,3,1);


    QFile plik("k.xml");

    plik.open(QIODevice::ReadOnly|QIODevice::Text);

    QTextStream in(&plik);

    QString someXML = in.readAll();

    plik.close();


    QDomDocument drzewo;

    QDomElement root; // cala baza, 

    QDomNode osoba1,osoba2; // osoba

    QDomElement ktos1,ktos2; // cala osoba, czyli 


    drzewo.setContent(someXML);

    root = drzewo.documentElement();

    osoba1 = root.firstChild();

    osoba2 = root.firstChild().nextSibling();

    ktos1 = osoba1.toElement();

    ktos2 = osoba2.toElement();


    wczytaj(ktos1);

    wczytaj(ktos2);


    QTextCodec::setCodecForCStrings (QTextCodec::codecForName ("Windows-1250"));

    setWindowTitle("Mała baza danych");

    setLayout(m);

}


void klasa::wczytaj(QDomElement ktos){

    pokazI->setText(ktos.attribute("imie"));

    pokazN->setText(ktos.attribute("nazwisko"));


    if (ktos.attribute("studiuje") =="false"){

        pokazS->setText("Nie");

    }else{

        pokazS->setText("Tak");

    }

    pokazM->setText(ktos.attribute("miejsce"));

}

KLASA.H

#ifndef KLASA_H

#define KLASA_H

#include 

class QLineEdit;

class QLabel;

class QDomElement;

class klasa : public QDialog{

    Q_OBJECT

    public:

        klasa();

    private:

        QLineEdit* pokazI;

        QLineEdit* pokazN;

        QLineEdit* pokazS;

        QLineEdit* pokazM;


        QLabel* imie;

        QLabel* nazwisko;

        QLabel* czyStudiuje;

        QLabel* miasto;


        void wczytaj(QDomElement);


};

#endif // KLASA_H