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
– Dodane 04.12.2009 (Pt) 19:37 –
ok, już mam. w razie problemów (chcę modyfikować i ulepszać program) pozwolę sobie pisac tutaj 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