Implementación de desarrollo de muestra de lectura y escritura de archivos XML, INI, JSON bajo Qt


prefacio

En el proceso de desarrollo de proyectos, a menudo se encuentra que se leen y escriben algunos archivos como XML, INI, JSON, etc.. Aquí, estos archivos están organizados y resumidos, y se muestra una demostración simple para realizar la lectura y escritura de los archivos anteriores, para que todos puedan aprender, como si hay errores, todos pueden criticar y corregir.

Efecto del proyectoPor favor agregue una descripción de la imagen


提示:以下是本篇文章正文内容,下面案例可供参考

1. Archivo XML

XML es un lenguaje de marcado extensible, un formato de texto común, que se usa ampliamente en el intercambio y almacenamiento de datos, y también se puede usar como un archivo de configuración.

Hay tres formas de leer archivos xml en Qt:
1. Use flujo XML, lea: QXmlStreamReader escriba: QXmlStreamWriter
2. Use DOM para leer y escribir
3. SAX proporciona una interfaz estándar basada en eventos para analizadores XML
Ejemplos en este artículo El El primer método se usa para leer y escribir, y se deben incluir los siguientes archivos de encabezado. Para conocer el método de implementación específico, consulte el código completo a continuación.

//xml
#include <QFile>
#include <QXmlStreamReader>
#include <QXmlStreamWriter>

Dos, archivo INI

El archivo INI es un archivo de inicialización. Generalmente almacena la información de inicialización de un programa. A menudo se usa como archivo de configuración. Su estructura es relativamente simple, consta de secciones, claves y valores, y es más fácil de operar.

En Qt, puede usar la clase QSettings para leer y escribir archivos ini. Se deben incluir los siguientes archivos de encabezado. Para la implementación específica, consulte el código completo a continuación.

//ini
#include <QSettings>

3. Archivo JSON

JSON es un formato ligero de intercambio de datos basado en un subconjunto de JavaScript, que es fácil de escribir y leer por los humanos, y fácil de analizar por las máquinas. Los archivos JSON se componen de objetos y matrices.

El archivo json leído y escrito en la demostración de este artículo es relativamente simple, solo objetos, pero en el caso de usar una matriz, se deben incluir los siguientes archivos de encabezado. Para la implementación específica, consulte el código completo a continuación.

//json
#include <QJsonObject>   //对象
#include <QJsonArray>    //数组
#include <QJsonDocument>

4. Ejemplo de código y contenido del archivo

1.widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMessageBox>
#include <QDebug>

//xml
#include <QFile>
#include <QXmlStreamReader>
#include <QXmlStreamWriter>

//ini
#include <QSettings>

//json
#include <QJsonObject>
#include <QJsonDocument>

QT_BEGIN_NAMESPACE
namespace Ui {
    
     class Widget; }
QT_END_NAMESPACE

typedef struct person
{
    
    
    QString name;
    QString gender;
    int age;
    double height;
    double weight;
}PersonData;

class Widget : public QWidget
{
    
    
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void xmlFlieRead();
    bool xmlFileWrite();
    void iniFileRead();
    bool iniFileWrite();
    void jsonFileRead();
    bool jsonFileWrite();
    void setFileValue(QString fileType);
    void showFileValue(QString fileType);

private slots:
    void on_pb_xmlRead_clicked();
    void on_pb_xmlWrite_clicked();
    void on_pb_iniRead_clicked();
    void on_pb_iniWrite_clicked();
    void on_pb_jsonRead_clicked();
    void on_pb_jsonWrite_clicked();

private:
    Ui::Widget *ui;

    PersonData xmlData;
    PersonData iniData;
    PersonData jsonData;

};
#endif // WIDGET_H

2.widget.cpp

#include "widget.h"
#include "ui_widget.h"

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

    this->xmlFlieRead();   //初始化读取xml文件
}

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

void Widget::xmlFlieRead()
{
    
    
    QString xmlFile = "D:/QT/Project/my_Project/18_FileReadWrite/TestFile/xmlFile.xml";
    QFile file(xmlFile);
    if(!file.open(QFile::ReadOnly | QFile::Text))
    {
    
    
        QMessageBox::warning(this,"警告","xml文件打开失败!");
        return;
    }
    QXmlStreamReader xmlRead;
    xmlRead.setDevice(&file);
    if(xmlRead.readNextStartElement())   //读取root
    {
    
    
        if(xmlRead.name().toString() == "root")
        {
    
    
            if(xmlRead.readNextStartElement())   //读取config
            {
    
    
                if(xmlRead.name().toString() == "config")
                {
    
    
                    while(xmlRead.readNextStartElement())   //循环读取Item
                    {
    
    
                        if(xmlRead.name().toString() == "Item")
                        {
    
    
                            QXmlStreamAttributes attributes = xmlRead.attributes();
                            if(attributes.hasAttribute("Name"))
                            {
    
    
                                QString s_name = attributes.value("Name").toString();
                                //qDebug()<<"s_name:"<<s_name;
                                if(s_name == "name")
                                {
    
    
                                    xmlData.name = xmlRead.readElementText();
                                }
                                else if(s_name == "gender")
                                {
    
    
                                    xmlData.gender = xmlRead.readElementText();
                                }
                                else if(s_name == "age")
                                {
    
    
                                    xmlData.age = xmlRead.readElementText().toInt();
                                }
                                else if(s_name == "height")
                                {
    
    
                                    xmlData.height = xmlRead.readElementText().toDouble();
                                }
                                else if(s_name == "weight")
                                {
    
    
                                    xmlData.weight = xmlRead.readElementText().toDouble();
                                }
                                else
                                {
    
    
                                    qDebug()<<"readItem error";
                                    xmlRead.readNextStartElement();
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    //更新界面
    showFileValue("xml");
}

bool Widget::xmlFileWrite()
{
    
    
    QString xmlFile = "D:/QT/Project/my_Project/18_FileReadWrite/TestFile/xmlFile.xml";
    QFile file(xmlFile);
    if(!file.open(QFile::WriteOnly | QFile::Text | QFile :: Truncate))
    {
    
    
        return false;
    }
    QXmlStreamWriter xmlWrite(&file);
    xmlWrite.setAutoFormatting(true);
    xmlWrite.writeStartDocument("1.0",true);
    xmlWrite.writeStartElement("root");
    xmlWrite.writeStartElement("config");
    xmlWrite.writeAttribute("filename","xmlFile.xml");

    xmlWrite.writeStartElement ("Item");
    xmlWrite.writeAttribute("Name","name");
    xmlWrite.writeAttribute("Type","string");
    xmlWrite.writeAttribute("Note","姓名");
    xmlWrite.writeCharacters(xmlData.name);
    xmlWrite.writeEndElement();

    xmlWrite.writeStartElement ("Item");
    xmlWrite.writeAttribute("Name","gender");
    xmlWrite.writeAttribute("Type","string");
    xmlWrite.writeAttribute("Note","性别");
    xmlWrite.writeCharacters(xmlData.gender);
    xmlWrite.writeEndElement();

    xmlWrite.writeStartElement ("Item");
    xmlWrite.writeAttribute("Name","age");
    xmlWrite.writeAttribute("Type","int");
    xmlWrite.writeAttribute("Note","年龄");
    xmlWrite.writeCharacters(QString::number(xmlData.age));
    xmlWrite.writeEndElement();

    xmlWrite.writeStartElement ("Item");
    xmlWrite.writeAttribute("Name","height");
    xmlWrite.writeAttribute("Type","double");
    xmlWrite.writeAttribute("Note","身高");
    xmlWrite.writeCharacters(QString::number(xmlData.height));
    xmlWrite.writeEndElement();

    xmlWrite.writeStartElement ("Item");
    xmlWrite.writeAttribute("Name","weight");
    xmlWrite.writeAttribute("Type","double");
    xmlWrite.writeAttribute("Note","体重");
    xmlWrite.writeCharacters(QString::number(xmlData.weight));
    xmlWrite.writeEndElement();

    xmlWrite.writeEndElement();    //config结束
    xmlWrite.writeEndElement();    //root结束
    xmlWrite.writeEndDocument();   //Document结束
    file.close();

    return true;
}

void Widget::iniFileRead()
{
    
    
    QString iniFile = "D:/QT/Project/my_Project/18_FileReadWrite/TestFile/iniFile.ini";
    QSettings iniRead(iniFile,QSettings::IniFormat);
    iniRead.setIniCodec("UTF-8");   //注意编码
    iniRead.beginGroup("VALUE");
    iniData.name = iniRead.value("name").toString();
    iniData.gender = iniRead.value("gender").toString();
    iniData.age = iniRead.value("age").toInt();
    iniData.height = iniRead.value("height").toDouble();
    iniData.weight = iniRead.value("weight").toDouble();
    iniRead.endGroup();

    //更新界面
    showFileValue("ini");
}

bool Widget::iniFileWrite()
{
    
    
    QString iniFile = "D:/QT/Project/my_Project/18_FileReadWrite/TestFile/iniFile.ini";
    QSettings iniWrite(iniFile,QSettings::IniFormat);
    iniWrite.setIniCodec("UTF-8");   //注意编码,解决中文字符乱码
    iniWrite.beginGroup("VALUE");
    iniWrite.setValue("name",iniData.name);
    iniWrite.setValue("gender",iniData.gender);
    iniWrite.setValue("age",iniData.age);
    iniWrite.setValue("height",iniData.height);
    iniWrite.setValue("weight",iniData.weight);
    iniWrite.endGroup();

    return true;
}

void Widget::jsonFileRead()
{
    
    
    QString jsonFile = "D:/QT/Project/my_Project/18_FileReadWrite/TestFile/jsonFile.json";
    QFile file(jsonFile);
    if(!file.open(QIODevice::ReadOnly))
    {
    
    
        QMessageBox::warning(this,"警告","json文件打开失败!");
        return;
    }
    QByteArray data(file.readAll());
    file.close();
    QJsonParseError jError;
    QJsonDocument jDoc = QJsonDocument::fromJson(data,&jError);
    if(jError.error != QJsonParseError::NoError)
    {
    
    
        QMessageBox::critical(this,"错误","json文件错误!");
        return;
    }
    QJsonObject mainObject = jDoc.object();
    {
    
    
        jsonData.name = mainObject["name"].toString();
        jsonData.gender = mainObject["gender"].toString();
        jsonData.age = mainObject["age"].toInt();
        jsonData.height = mainObject["height"].toDouble();
        jsonData.weight = mainObject["weight"].toDouble();
    }

    //更新界面
    showFileValue("json");
}

bool Widget::jsonFileWrite()
{
    
    
    QJsonObject mainObject;   //读写比较复杂的json文件,可以使用大括号来方便区分
    {
    
    
        mainObject.insert("name",jsonData.name);
        mainObject.insert("gender",jsonData.gender);
        mainObject.insert("age",jsonData.age);
        mainObject.insert("height",jsonData.height);
        mainObject.insert("weight",jsonData.weight);
    }
    QJsonDocument jDoc(mainObject);
    QString jsonFile = "D:/QT/Project/my_Project/18_FileReadWrite/TestFile/jsonFile.json";
    QFile file(jsonFile);
    if(!file.open(QIODevice::WriteOnly))
    {
    
    
        return false;
    }
    QByteArray data(jDoc.toJson());
    file.write(data);
    file.close();

    return true;
}

void Widget::setFileValue(QString fileType)
{
    
    
    if(fileType == "xml")
    {
    
    
        xmlData.name = ui->le_name->text();
        xmlData.gender = ui->cb_gender->currentText();
        xmlData.age = ui->le_age->text().toInt();
        xmlData.height = ui->le_height->text().toDouble();
        xmlData.weight = ui->le_weight->text().toDouble();
    }
    else if(fileType == "ini")
    {
    
    
        iniData.name = ui->le_name->text();
        iniData.gender = ui->cb_gender->currentText();
        iniData.age = ui->le_age->text().toInt();
        iniData.height = ui->le_height->text().toDouble();
        iniData.weight = ui->le_weight->text().toDouble();
    }
    else if(fileType == "json")
    {
    
    
        jsonData.name = ui->le_name->text();
        jsonData.gender = ui->cb_gender->currentText();
        jsonData.age = ui->le_age->text().toInt();
        jsonData.height = ui->le_height->text().toDouble();
        jsonData.weight = ui->le_weight->text().toDouble();
    }
}

void Widget::showFileValue(QString fileType)
{
    
    
    if(fileType == "xml")
    {
    
    
        ui->le_name->setText(xmlData.name);
        if(xmlData.gender == "男")
        {
    
    
            ui->cb_gender->setCurrentIndex(0);
        }
        else if(xmlData.gender == "女")
        {
    
    
            ui->cb_gender->setCurrentIndex(1);
        }
        else
        {
    
    
            ui->cb_gender->setCurrentIndex(0);
        }
        ui->le_age->setText(QString::number(xmlData.age));
        ui->le_height->setText(QString::number(xmlData.height));
        ui->le_weight->setText(QString::number(xmlData.weight));
    }
    else if(fileType == "ini")
    {
    
    
        ui->le_name->setText(iniData.name);
        if(iniData.gender == "男")
        {
    
    
            ui->cb_gender->setCurrentIndex(0);
        }
        else
        {
    
    
            ui->cb_gender->setCurrentIndex(1);
        }
        ui->le_age->setText(QString::number(iniData.age));
        ui->le_height->setText(QString::number(iniData.height));
        ui->le_weight->setText(QString::number(iniData.weight));
    }
    else if(fileType == "json")
    {
    
    
        ui->le_name->setText(jsonData.name);
        if(jsonData.gender == "男")
        {
    
    
            ui->cb_gender->setCurrentIndex(0);
        }
        else
        {
    
    
            ui->cb_gender->setCurrentIndex(1);
        }
        ui->le_age->setText(QString::number(jsonData.age));
        ui->le_height->setText(QString::number(jsonData.height));
        ui->le_weight->setText(QString::number(jsonData.weight));
    }
}

void Widget::on_pb_xmlRead_clicked()
{
    
    
    xmlFlieRead();
}

void Widget::on_pb_xmlWrite_clicked()
{
    
    
    setFileValue("xml");
    if(xmlFileWrite())
    {
    
    
        QMessageBox::information(this,"提示","xml文件保存成功!");
    }
}

void Widget::on_pb_iniRead_clicked()
{
    
    
    iniFileRead();
}

void Widget::on_pb_iniWrite_clicked()
{
    
    
    setFileValue("ini");
    if(iniFileWrite())
    {
    
    
        QMessageBox::information(this,"提示","ini文件保存成功!");
    }
}

void Widget::on_pb_jsonRead_clicked()
{
    
    
    jsonFileRead();
}

void Widget::on_pb_jsonWrite_clicked()
{
    
    
    setFileValue("json");
    if(jsonFileWrite())
    {
    
    
        QMessageBox::information(this,"提示","json文件保存成功!");
    }
}

3.widget.uiPor favor agregue una descripción de la imagen

4. Contenido de cada archivo en el ejemplo
Por favor agregue una descripción de la imagen

5. Enlace de descarga

Mi ejemplo de enlace de disco de red Baidu: https://pan.baidu.com/s/1M1Flq0-1lj4A5KV3sRdLUw
Código de extracción: xxcj


Resumir

Se puede ver que los varios archivos que se leen y escriben en la demostración de este artículo son relativamente simples, con menos contenido y una estructura relativamente simple. Aquí solo se muestran los métodos básicos de lectura y escritura. Sin embargo, en el proceso de desarrollo real, habrá estructuras complejas como bucles y anidamientos en el contenido del archivo. Para archivos relacionados, puede consultar los artículos de referencia al final del artículo. Necesitamos prestar atención a la observación durante nuestro proceso de desarrollo. De hecho, estos tipos de lectura y escritura de archivos son relativamente simples. Esencialmente, se trata de obtener parámetros, escribir archivos, leer parámetros y mostrar los parámetros de lectura en la interfaz. Además, en el desarrollo real, se recomienda escribir el archivo primero y luego leerlo, para que se sienta fácil de desarrollar (jaja, este es mi propio sentimiento jio ~~~).


hola:
Aprendamos juntos y progresemos juntos. Si aún tiene preguntas relacionadas, puede dejar un mensaje en el área de comentarios para la discusión.

Artículo de referencia:
Ejemplos de tres formas de leer archivos XML en QT
Qt lee y escribe archivos ini
Introducción JSON
Qt opera archivos en formato Json (crear, insertar, analizar, modificar, eliminar)

Supongo que te gusta

Origin blog.csdn.net/XCJandLL/article/details/127775991
Recomendado
Clasificación