Elemente einer XML in QListWidget anzeigen



  • Hi,
    mein Programm soll alle Elemente einer xml in einem QListWidget anzeigen.
    Im QListWidget wird aber nichts angezeigt.

    Hier soll das alles im Konstruktor geschehen:

    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        QFile *datei = new QFile("DATEI.xml"); //Die Datei DATEI.xml ist im Build-Verzeichnis
        //QFile *datei = new QFile("E:/C++/.../DATEI.xml"); //Funktioniert auch nicht
        datei->open(QIODevice::ReadOnly);
        QXmlStreamReader xmlReader(datei);
        while (!(xmlReader.atEnd()))
        {
            xmlReader.readNext();
            ui->listWidget->addItem(xmlReader.readElementText()); //Problem mit der Methode readElementText()
        }
        datei->close();
    }
    

    Ich vermute das Problem bei

    readElementText()
    


  • @theAnfänger77
    QFile *datei = new QFile("DATEI.xml");

    Das ist doch nicht dein Ernst.

    Ich vermute das Problem bei

    Warum?



  • Doch, das ist es:

    QFile *datei = new QFile("DATEI.xml");
    

    Warum sollte es das nicht sein?

    Das Problem vermute ich bei:

    readElementText()
    

    weil ich diese Methode gerade neu ausprobiere und mit dem Argument:
    QXmlStreamReader::ReadElementTextBehaviour behaviour = ErrorOnUnexpectedElement
    eigentlich nicht viel anfangen kann weil das Thema für mich noch Neuland ist.



  • @theAnfänger77

    Warum sollte es das nicht sein?

    new? Warum zur Hölle?

    Blablabla

    Das ist keine Begründung.



  • Wenn man die Datei so erzeugt:

    QFile datei ("DATEI.xml");
    

    sie dann öffnet:

    datei.open(QIODevice::ReadOnly);
    

    und sie dann Lesen möchte:

    QXmlStreamReader xmlReader(datei);
    

    erhält man die Fehlermeldung: no matching constructor for initialization of 'QXmlStreamReader'



  • @theAnfänger77 sagte in Elemente einer XML in QListWidget anzeigen:

    QXmlStreamReader

    QFile datei ("DATEI.xml");
    datei.open(QIODevice::ReadOnly);
    QXmlStreamReader xmlReader(&datei);
    

    Aber, was gibt "open" zurück, also, wurde die Datei wirklich geöffnet?
    Was ist der Status von xmlReader nach readNext(), konnte was gelesen werden? Du hast überhaupt keine Fehlerbehandlung und rätst was schief gegangen ist.



  • @theAnfänger77
    Das ist ja echt komisch. Du machst jetzt also seit einem Jahr C++ und weißt nicht, wie das funktioniert?



  • Komisch ist, dass die Datei wirklich geöffnet wurde, sonst würde dieses Programm eine Fehlermeldung ausgeben:

    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        QFile datei("DATEI.xml"); 
        datei.open(QIODevice::ReadOnly);
        QXmlStreamReader xmlReader(&datei);
    
        if(xmlReader.hasError())
            QMessageBox::critical(this, "Fehler", "Datei wurde nicht geöffnet.");
    
        while (!(xmlReader.atEnd()))
        {
            xmlReader.readNext();
            ui->listWidget->addItem(xmlReader.readElementText()); 
        }
        datei.close();
    }
    


  • @theAnfänger77 sagte in Elemente einer XML in QListWidget anzeigen:

    Du prüfst dem xml Stream nicht die Datei...

    if(!datei.open(QIODevice::ReadOnly))
    {
       QMessageBox::critical(this, "Fehler", "Datei wurde nicht geöffnet.");
       return;
    }
    
    //...
    xmlReader.readNext();
    if(xmlReader.hasError())
            QMessageBox::critical(this, "Fehler", "Xml geht zu Weihnachten nicht.");
    
    

    QT hat eigentlich eine ganz brauchbare Doku, vlt guckst du dir die Beispiele da mal an 😉



  • Ah! Sorry! 😱
    So natürlich:

    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        QFile datei("DATEI.xml"); //Die Datei DATEI.xml ist im Build-Verzeichnis
    
        if(datei.exists() == false)
            QMessageBox::critical(this, "Fehler", "Datei existiert nicht.");
    
        datei.open(QIODevice::ReadOnly);
        QXmlStreamReader xmlReader(&datei);
    
        while (!(xmlReader.atEnd()))
        {
            xmlReader.readNext();
            ui->listWidget->addItem(xmlReader.readElementText());
        }
        datei.close();
    }
    


  • Das close brauchst nicht, das macht der Destruktor.
    Man sollte evtl. den Rückgabewert von open prüfen.



  • Das ist es!
    Das Öffnen hat nicht funktioniert.
    Der Fehler muss also bei folgendem Code in Zeile 11 sein:

    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        QFile datei("DATEI.xml"); //Die Datei DATEI.xml ist im Build-Verzeichnis
    
        if(datei.exists() == false)
            QMessageBox::critical(this, "Fehler", "Datei existiert nicht.");
    
        datei.open(QIODevice::ReadOnly); //HAT NICHT FUNKTIONIERT !!!
    
        if(!datei.open(QIODevice::ReadOnly))
        {
           QMessageBox::critical(this, "Fehler", "Datei wurde nicht geöffnet.");
           return;
        }
    
        QXmlStreamReader xmlReader(&datei);
    
        while (!(xmlReader.atEnd()))
        {
            xmlReader.readNext();
            ui->listWidget->addItem(xmlReader.readElementText());
        }
    }
    

    Aber jetzt ist die Frage warum

    datei.open(QIODevice::ReadOnly);
    

    nicht funktioniert.



  • Warum versuchst du die Datei zweimal zu öffnen???
    Dass sie beim zweiten Mal false zurückliefert, kann beabsichtigt sein.



  • Stimmt!
    Wenn ich Zeile 11 rausnehme kommt keine Fehlermeldung.
    Aber das bedeutet ja, dass die Datei geöffnet ist!
    Und am QXmlStreamReader hängt es wohl auch nicht:

    if(xmlReader.hasError())
                    QMessageBox::critical(this, "Fehler", "Xml geht zu Weihnachten nicht.");
    


  • Am besten, du benutzt den Debugger dafür (oder Testausgaben per Konsole o.ä.).

    Code-technisch kannst du dich auch an QXmlStream Bookmarks Example oder Reading an XML cookbook file with QXmlStreamReader orientieren (dort wird readNextStartElement() statt readNext() benutzt).



  • Hey, vielen Dank! 🙂 🙂 🙂
    Hab jetzt durch Wurschteln und Ausprobieren diese Funktionierende Version:
    (Hab die Fehlerbehandlungen rausgenommen um es prägnanter zu machen)

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        QFile datei("DATEI.xml");
        datei.open(QIODevice::ReadOnly);
        QXmlStreamReader xmlReader(&datei);
        xmlReader.readNext();
        while (!(xmlReader.atEnd()))
        {
            if (xmlReader.readNext() == QXmlStreamReader::StartElement)
            {
                if (xmlReader.name() == "eintrag")
                    ui->listWidget->addItem(xmlReader.readElementText());
            }
        }
    }
    

    Hier noch die XML:

    <?xml version="1.0" encoding="UTF-8"?>
    <eintraege>
        <eintrag>DAS</eintrag>
        <eintrag>PROBLEM</eintrag>
        <eintrag>IST</eintrag>
        <eintrag>GELOEST</eintrag>
    </eintraege>
    

    Aber keine Ahnung, warum das Programm nur so die Einträge anzeigt.


Log in to reply