Evgenii Legotckoi
Evgenii LegotckoiAug. 28, 2015, 9:34 a.m.

Qt/C++ - Lesson 011. XML files in Qt – Reading and Writing

Qt development tools include functionality for working with XML files, which allows you to create XML files and read them, which may be useful to create the automatic creation of XML markup software, configuration files, using XML, or for parsing XML-files .

To record in an XML file format used QXmlStreamWriter class, while the other is used QXmlStreamReader class to read an XML file.

The project structure for working with XML file

This project uses the minimum number of files:

  • XMLExample.pro - profile;
  • mainwindow.h - header file of the main application window;
  • mainwindow.cpp - source of window;
  • main.cpp - the main source file from which the application starts;
  • mainwindow.ui - form of the main application window;

mainwindow.ui

At this time in the form of the main window, you must add a sufficiently large number of items to make it look like this:

The main window of the application to work with an XML file List of all the elements with which the work will be done in code:

  • checkBox - first checkbox;
  • checkBox_1 - the second Checkbox;
  • checkBox_2 - third checkbox;
  • lineEditCB1 - lineEdit for the first checkbox;
  • lineEditCB2 - lineEdit second checkbox;
  • lineEditCB3 - lineEdit for the third checkbox;
  • lineEditRead - lineEdit, which specifies the path to the file for reading;
  • lineEditWrite - lineEdit, which indicates the path to the file for writing;
  • dialogReadButton - button to call up the dialog to save the file in this case is simple file selection, which will be carried out the work;
  • dialogButton - button to call up the file recording the dialogue, in this case, the file is simply a choice, which will also be carried out work;
  • readButton - key performance reading from a file;
  • generateButton - button to record a file.

mainwindow.h

In the header file for the library connected with QXmlStreamWriter and QXmlStreamReader. Also announced slots handlers keystrokes.

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFileDialog>
#include <QXmlStreamWriter>
#include <QXmlStreamReader>
#include <QXmlStreamAttribute>
#include <QMessageBox>
#include <QFile>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    /* Slots handlers buttons which work with the record in the file */
    void on_generateButton_clicked();
    void on_dialogButton_clicked();

    /* Slots handlers buttons which work with the reading in the file */
    void on_readButton_clicked();
    void on_dialogReadButton_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

This source file reads and writes data into XML-file as well as the substitution of the parameters of the XML-file in the form of the main window.

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

/* The method performs recording of information in XML-file
 * */
void MainWindow::on_generateButton_clicked()
{
    /* Open the file for writing using the path specified in lineEditWrite */
    QFile file(ui->lineEditWrite->text());
    file.open(QIODevice::WriteOnly);

    /* Create an object, through which the recording to file */
    QXmlStreamWriter xmlWriter(&file);
    xmlWriter.setAutoFormatting(true);  // Set the auto-formatting text
    xmlWriter.writeStartDocument();     // run record in a document
    xmlWriter.writeStartElement("resources");   // Write the first element of his name

    xmlWriter.writeStartElement("checkBox_1");  // Write tag with the name for the first checkbox
    /* On the basis of the state of the checkbox attribute record "boolean" 
     * indicating the state of the checkbox in this attribute
     * */
    xmlWriter.writeAttribute("boolean",
                             (ui->checkBox->isChecked() ? "true" : "false"));
    /* We write in the body of this element from the corresponding line qlineEdit
     * */
    xmlWriter.writeCharacters(ui->lineEditCB1->text());
    xmlWriter.writeEndElement();        // Закрываем тег


    /* Repeat the same procedure for the other two checkboxes
     * */
    xmlWriter.writeStartElement("checkBox_2");
    xmlWriter.writeAttribute("boolean",
                             (ui->checkBox_2->isChecked() ? "true" : "false"));
    xmlWriter.writeCharacters(ui->lineEditCB2->text());
    xmlWriter.writeEndElement();

    xmlWriter.writeStartElement("checkBox_3");
    xmlWriter.writeAttribute("boolean",
                             (ui->checkBox_3->isChecked() ? "true" : "false"));
    xmlWriter.writeCharacters(ui->lineEditCB3->text());
    xmlWriter.writeEndElement();

    /* Close tag "resources"
     * */
    xmlWriter.writeEndElement();
    /* Finish the writing in the document
     * */
    xmlWriter.writeEndDocument();
    file.close();   // Закрываем файл
}

/* The method, which causes the file selection dialog box to save the data
 * */
void MainWindow::on_dialogButton_clicked()
{
    /* Call the file selection dialog to save */
    QString filename = QFileDialog::getSaveFileName(this,
                                           tr("Save Xml"), ".",
                                           tr("Xml files (*.xml)"));
    /* Set in lineEditWrite path to the file, with which we will work */
    if(filename != ""){
        ui->lineEditWrite->setText(filename);
    }
}

void MainWindow::on_readButton_clicked()
{
    /* Open the file for reading by using the path specified in lineEditWrite */
    QFile file(ui->lineEditRead->text());
    if (!file.open(QFile::ReadOnly | QFile::Text))
    {
        QMessageBox::warning(this,
                             "Ошибка файла",
                             "Не удалось открыть файл",
                             QMessageBox::Ok);
    } else {
        /* Create an object, through which the reading of the file */
        QXmlStreamReader xmlReader;
        xmlReader.setDevice(&file);
        xmlReader.readNext();   // Moves to the first item in the file

        /* Work in a loop as long as we reach the end of the document
         * */
        while(!xmlReader.atEnd())
        {
            /* Check whether the beginning of the tag element
             * */
            if(xmlReader.isStartElement())
            {
                /* Check whether the tag refers to one of the checkboxes. 
                 * If "YES", then a check attribute checkbox and records for lineEdit
                 * */
                if(xmlReader.name() == "checkBox_1")
                {
                    /* Taking all of the tag attributes, 
                     * and through them to check for compliance with the required attribute to us
                     * */
                    foreach(const QXmlStreamAttribute &attr, xmlReader.attributes()) {
                        /* If the attribute is found, then its value is set the state of the checkbox
                         * */
                        if (attr.name().toString() == "boolean") {
                            QString attribute_value = attr.value().toString();
                            ui->checkBox->setChecked((QString::compare(attribute_value , "true") == 0) ? true : false);

                        }
                    }
                    /* pick up text from the body tag and paste it appropriate qlineEdit
                     * */
                    ui->lineEditCB1->setText(xmlReader.readElementText());

                    /* similar to working with other tags */
                } else if (xmlReader.name() == "checkBox_2"){
                    foreach(const QXmlStreamAttribute &attr, xmlReader.attributes()) {
                        if (attr.name().toString() == "boolean") {
                            QString attribute_value = attr.value().toString();
                            ui->checkBox_2->setChecked((QString::compare(attribute_value , "true") == 0) ? true : false);

                        }
                    }
                    ui->lineEditCB2->setText(xmlReader.readElementText());
                } else if (xmlReader.name() == "checkBox_3"){
                    foreach(const QXmlStreamAttribute &attr, xmlReader.attributes()) {
                        if (attr.name().toString() == "boolean") {
                            QString attribute_value = attr.value().toString();
                            ui->checkBox_3->setChecked((QString::compare(attribute_value , "true") == 0) ? true : false);

                        }
                    }
                    ui->lineEditCB3->setText(xmlReader.readElementText());
                }
            }
            xmlReader.readNext(); // Go to the next file element
        }
        file.close(); // Close the file

        /* This code is not checking for the closing tag because it is not necessary, 
         * but it allows the functional QXmlStreamReader
         * */
    }
}

/* The method, which causes the file selection dialog box to read the data
 * */
void MainWindow::on_dialogReadButton_clicked()
{
    /* Call the file selection dialog to read */
    QString filename = QFileDialog::getOpenFileName(this,
                                       tr("Open Xml"), ".",
                                       tr("Xml files (*.xml)"));
   /* Set in lineEditRead path to the file, which will work */
    if(filename != ""){
        ui->lineEditRead->setText(filename);
    }
}

As a result, we are able to create XML-file with the parameters and checkboxes our lineEdit types of objects, as well as to parse the file and set the data in the appropriate checkboxes and objects lineEdit.

The resulting file should be as follows:

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <checkBox_1 boolean="false">XML</checkBox_1>
    <checkBox_2 boolean="false">Example</checkBox_2>
    <checkBox_3 boolean="true">EVILEG</checkBox_3>
</resources>

Result

As a result, should have the application that creates or rewrites the XML-file, taking data from the respective fields and checkboxes lineEdit, as well as producing the parsing of the XML-file data by setting the check boxes and fields lineEdit.

The application for working with XML files

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

C
  • Jan. 20, 2017, 1:40 p.m.

Не могли бы предоставить пример, где больше уровней в xml файле?

Evgenii Legotckoi
  • Jan. 20, 2017, 11:48 p.m.

Это конечно можно, но насколько больше? И применительно к какому виду... Всё упирается же в то, куда именно будет этот XML применяться.

Например, чтение данных из XML можно сделать и с помощью QDomDocument. А если учесть, что SVG файл также фактически является XML документом, то Вы можете посмотреть следующий пример, для ознакомления с вытягиванием данных из XML файла:

SvgReader на Qt. Восстановление данных из файла SVG в QGraphicsScene

Comments

Only authorized users can post comments.
Please, Log in or Sign up
AD

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:50points,
  • Rating points-4
m

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:80points,
  • Rating points4
m

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:20points,
  • Rating points-10
Last comments
Evgenii Legotckoi
Evgenii LegotckoiNov. 1, 2024, 12:37 a.m.
Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEOct. 19, 2024, 6:19 p.m.
Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовOct. 5, 2024, 5:51 p.m.
Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5July 5, 2024, 9:02 p.m.
QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrFeb. 9, 2024, 5:43 a.m.
Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Now discuss on the forum
Evgenii Legotckoi
Evgenii LegotckoiJune 25, 2024, 1:11 a.m.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Nov. 15, 2024, 5:04 p.m.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectJune 4, 2022, 1:49 p.m.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9AnonimOct. 25, 2024, 7:10 p.m.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Follow us in social networks