Qt әзірлеу құралдары XML файлдарымен жұмыс істеуге арналған функционалдылықты қамтиды, бұл XML файлдарын жасауға және оларды оқуға мүмкіндік береді, бұл XML белгілеулерін, конфигурацияны автоматты түрде жасау үшін бағдарламаларды жасау үшін пайдалы болуы мүмкін. XML пайдаланатын файлдар немесе XML файлдарын талдау үшін.
QXmlStreamWriter класы XML файлдарын жазу үшін, ал басқа QXmlStreamReader. класы XML файлдарын оқу үшін пайдаланылады.
Код Qt 5.4.1 негізінде QtCreator 3.3.1-де жазылған.
XML файлымен жұмыс істеуге арналған жоба құрылымы
Бұл жоба ең аз файлдарды пайдаланады:
- XMLExample.pro - профиль;
- mainwindow.h – қосымшаның негізгі терезесінің тақырып файлы;
- mainwindow.cpp – терезенің бастапқы коды;
- main.cpp – қолданба басталатын негізгі бастапқы файл;
- mainwindow.ui – қосымшаның негізгі терезесінің формасы;
mainwindow.ui
Бұл жолы біз негізгі терезе пішініне жеткілікті көп элементтерді қосуымыз керек, сонда ол келесідей болады:
XML файлымен жұмыс істеуге арналған қолданбаның негізгі терезесі Бағдарлама кодында өңделетін барлық элементтердің тізімі:
- checkBox - бірінші құсбелгі;
- checkBox_1 - екінші құсбелгі;
- checkBox_2 - үшінші құсбелгі;
- lineEditCB1 - бірінші құсбелгі үшін lineEdit;
- lineEditCB2 - екінші құсбелгі үшін lineEdit;
- lineEditCB3 - үшінші құсбелгі үшін lineEdit;
- lineEditRead - оқылатын файлдың жолын көрсететін lineEdit;
- lineEditWrite – жазылатын файлдың жолын көрсететін lineEdit;
- dialogReadButton - файлды сақтау диалогын шақыру түймесі, бұл жағдайда жұмыс істеу үшін файлды таңдайсыз;
- dialogButton – файлды жазуға арналған диалогты шақыру батырмасы, бұл жағдайда файлды таңдау жеткілікті, ол да жұмыс істейді;
- readButton – файлдан оқуға арналған батырма;
- generateButton - файлға жазу түймесі.
mainwindow.h
Тақырып файлы QXmlStreamWriter және QXmlStreamReader бағдарламаларымен жұмыс істеуге арналған кітапханаларды қамтиды.** Сондай-ақ, түймелерді басу өңдеушілеріне арналған ұяшықтар жарияланған.
#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: /* Слоты обработчиков кнопок, работающих с записью в файл */ void on\_generateButton\_clicked(); void on\_dialogButton\_clicked(); /* Слоты обработчиков кнопок, работающих с чтением из файла */ void on\_readButton\_clicked(); void on\_dialogReadButton\_clicked(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW\_H
mainwindow.cpp
Бұл бастапқы файл XML файлына деректерді оқиды және жазады, сонымен қатар XML файлындағы параметрлерді негізгі терезенің пішіндеріне ауыстырады.
#include "mainwindow.h" #include "ui\_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } /* Метод, выполняющий запись информации в XML-файл * */ void MainWindow::on\_generateButton\_clicked() { /* Открываем файл для Записи с помощью пути, указанного в lineEditWrite */ QFile file(ui->lineEditWrite->text()); file.open(QIODevice::WriteOnly); /* Создаем объект, с помощью которого осуществляется запись в файл */ QXmlStreamWriter xmlWriter(&file); xmlWriter.setAutoFormatting(true); // Устанавливаем автоформатирование текста xmlWriter.writeStartDocument(); // Запускаем запись в документ xmlWriter.writeStartElement("resources"); // Записываем первый элемент с его именем xmlWriter.writeStartElement("checkBox\_1"); // Записываем тег с именем для первого чекбокса /* На основе состояния чекбокса записываем атрибут "boolean" * с указанием состояния чекбокса в этом атрибуте * */ xmlWriter.writeAttribute("boolean", (ui->checkBox->isChecked() ? "true" : "false")); /* Записываем также в тело этого элемента строку из соответствующего lineEdit * */ xmlWriter.writeCharacters(ui->lineEditCB1->text()); xmlWriter.writeEndElement(); // Закрываем тег /* Повторяем те же действия для двух других чекбоксов * */ 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(); /* Закрываем тег "resources" * */ xmlWriter.writeEndElement(); /* Завершаем запись в документ * */ xmlWriter.writeEndDocument(); file.close(); // Закрываем файл } /* Метод, вызывающий диалоговое окно выбора файла для сохранения данных * */ void MainWindow::on\_dialogButton\_clicked() { /* Вызываем диалог выбора файла для сохранения */ QString filename = QFileDialog::getSaveFileName(this, tr("Save Xml"), ".", tr("Xml files (*.xml)")); /* Устанавливаем в lineEditWrite путь к файлу, с которым будем работать */ if(filename != ""){ ui->lineEditWrite->setText(filename); } } void MainWindow::on\_readButton\_clicked() { /* Открываем файл для Чтения с помощью пути, указанного в lineEditWrite */ QFile file(ui->lineEditRead->text()); if (!file.open(QFile::ReadOnly | QFile::Text)) { QMessageBox::warning(this, "Ошибка файла", "Не удалось открыть файл", QMessageBox::Ok); } else { /* Создаем объект, с помощью которого осуществляется чтение из файла */ QXmlStreamReader xmlReader; xmlReader.setDevice(&file); xmlReader.readNext(); // Переходит к первому элементу в файле /* Крутимся в цикле до тех пор, пока не достигнем конца документа * */ while(!xmlReader.atEnd()) { /* Проверяем, является ли элемент началом тега * */ if(xmlReader.isStartElement()) { /* Проверяем, относится ли тег к одному из чекбоксов. * Если "ДА", то выполняем проверку атрибута чекбокса * и записи для lineEdit * */ if(xmlReader.name() == "checkBox\_1") { /* Забираем все атрибуты тега и перебираем их для проверки на соответствие * нужному нам атрибуту * */ foreach(const QXmlStreamAttribute &attr, xmlReader.attributes()) { /* Если найден нужный атрибут, то по его значению устанавливаем * состояние чекбокса * */ if (attr.name().toString() == "boolean") { QString attribute\_value = attr.value().toString(); ui->checkBox->setChecked((QString::compare(attribute\_value , "true") == 0) ? true : false); } } /* забираем текст из тела тега и вставляем его соответствующий lineEdit * */ ui->lineEditCB1->setText(xmlReader.readElementText()); /* аналогично работаем с остальными тегами */ } 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(); // Переходим к следующему элементу файла } file.close(); // Закрываем файл /* В данном коде не осуществляется проверка на закрытие тега * поскольку в этом нет необходимости, но функционал QXmlStreamReader это позволяет * */ } } /* Метод, вызывающий диалоговое окно выбора файла для чтения данных * */ void MainWindow::on\_dialogReadButton\_clicked() { /* Вызываем диалог выбора файла для чтения */ QString filename = QFileDialog::getOpenFileName(this, tr("Open Xml"), ".", tr("Xml files (*.xml)")); /* Устанавливаем в lineEditRead путь к файлу, с которым будем работать */ if(filename != ""){ ui->lineEditRead->setText(filename); } }
Нәтижесінде құсбелгілер параметрлері бар XML файлын және lineEdit түріндегі нысандарымызды құруға, сондай-ақ осы файлды талдауға және алынған деректерді орнатуға мүмкіндік аламыз. сәйкес құсбелгілер және нысандар lineEdit.
Алынған файл келесідей болуы керек:
<?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>
Барлығы
Нәтиже құсбелгілер және сәйкес lineEdit өрістерінен деректерді алып, осы XML файлын талдап, деректерді * етіп орнататын XML файлын жасайтын немесе қайта жазатын қолданба болуы керек. құсбелгілер және lineEdit * өрістері.
XML файлдарымен жұмыс істеуге арналған қосымша
Не могли бы предоставить пример, где больше уровней в xml файле?
Это конечно можно, но насколько больше? И применительно к какому виду... Всё упирается же в то, куда именно будет этот XML применяться.
Например, чтение данных из XML можно сделать и с помощью QDomDocument. А если учесть, что SVG файл также фактически является XML документом, то Вы можете посмотреть следующий пример, для ознакомления с вытягиванием данных из XML файла:
SvgReader на Qt. Восстановление данных из файла SVG в QGraphicsScene