Elemente einer XML in QListWidget anzeigen



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


Anmelden zum Antworten