Elemente einer XML in QListWidget anzeigen



  • @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