Qt之读写Xml

本文详细介绍使用Qt的QDomComment类实现XML文件的读写操作。通过代码示例,展示了如何创建、读取和解析XML节点,以及如何将数据写入XML文件。适合初学者和需要快速上手Qt XML操作的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述:

1. 使用QDomComment类读写xml文件
2. 需要注意的地方会在代码中进行注释

代码示例:

.pro

#-------------------------------------------------
#
# Project created by QtCreator 2020-05-26T19:51:47
#
#-------------------------------------------------

#添加xml库
QT       += core gui xml

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = ReadWriteXml
TEMPLATE = app


SOURCES += main.cpp\
        ReadWriteXml.cpp

HEADERS  += ReadWriteXml.h

FORMS    += ReadWriteXml.ui

.h

#ifndef READWRITEXML_H
#define READWRITEXML_H

#include <QDialog>
#include <QDomComment>
#include <QDir>
#include <QFile>
#include <QDebug>

namespace Ui {
class ReadWriteXml;
}

class ReadWriteXml : public QDialog
{
    Q_OBJECT

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

private slots:
    /**
     * @brief on_pushButton_write_clicked
     *          写入xml文件
     */
    void on_pushButton_write_clicked();

    /**
     * @brief on_pushButton_read_clicked
     *          读取xml文件
     */
    void on_pushButton_read_clicked();

private:
    /**
     * @brief openXml   打开指定文件
     * @return
     */
    bool openXml(QString fileNamePath);

    /**
     * @brief readXml   读取指定文件
     */
    void readXml();

    /**
     * @brief readRootXml   读取子结点数据
     */
    void readRootXml(QDomNodeList sonNodeList);

    /**
     * @brief writeXml  写入指定文件
     */
    void writeXml();

private:
    Ui::ReadWriteXml *ui;
    QFile m_file;
    QString currFilePath;   //当前文件路径
    QString currFileName;   //当前文件名字
};

#endif // READWRITEXML_H

.cpp

#include "ReadWriteXml.h"
#include "ui_ReadWriteXml.h"

ReadWriteXml::ReadWriteXml(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::ReadWriteXml)
{
    ui->setupUi(this);
    QDir dir;
    //currFilePath = dir.currentPath();
    currFilePath = "D:/QtApp/ReadWriteXml";
    currFileName = "/Qt幻想家.xml";
}

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

bool ReadWriteXml::openXml(QString fileNamePath)
{
    m_file.setFileName(currFilePath + fileNamePath);        //没有则创建文件
    return m_file.open(QIODevice::ReadWrite | QFile::Text);
}


void ReadWriteXml::writeXml()
{
    if(!openXml(currFileName))
    {
        qDebug() << " Write Open false";
        return;
    }
    qDebug() << " Write Open true";

    QDomDocument domDoc;
    QDomProcessingInstruction version;
    version = domDoc.createProcessingInstruction("xml","version = \"1.0\" encoding = \"GB2312\"");
    domDoc.appendChild(version);

    QDomElement domRootElement = domDoc.createElement("Fantast");   //创建顶节点
    domDoc.appendChild(domRootElement);

    QDomElement itemRootElement = domDoc.createElement("teacher");  //创建父节点
    {
        QDomElement node1 = domDoc.createElement("TName");           //创建子结点
        QDomText domText1 = domDoc.createTextNode("TName");
        domText1.setData(ui->lineEdit_W_Tname->text());             //设置子结点数据
        node1.appendChild(domText1);                                //将子节点数据绑定
        itemRootElement.appendChild(node1);                         //将子节点帮到父节点

        QDomElement node2 = domDoc.createElement("TSchool");
        QDomText domText2 = domDoc.createTextNode("TSchool");
        domText2.setData(ui->lineEdit_W_Tschool->text());
        node2.appendChild(domText2);
        itemRootElement.appendChild(node2);

        QDomElement node3 = domDoc.createElement("TAge");
        QDomText domText3 = domDoc.createTextNode("TAge");
        domText3.setData(QString::number(ui->lineEdit_W_Tage->text().toInt()));
        node3.appendChild(domText3);
        itemRootElement.appendChild(node3);

        QDomElement node4 = domDoc.createElement("TSubject");
        QDomText domText4 = domDoc.createTextNode("TSubject");
        domText4.setData(ui->lineEdit_W_Tsubject->text());
        node4.appendChild(domText4);
        itemRootElement.appendChild(node4);

        QDomElement node5 = domDoc.createElement("SName");
        QDomText domText5 = domDoc.createTextNode("SName");
        domText5.setData(ui->lineEdit_W_Sname->text());
        node5.appendChild(domText5);
        itemRootElement.appendChild(node5);

        QDomElement node6 = domDoc.createElement("SSchool");
        QDomText domText6 = domDoc.createTextNode("SSchool");
        domText6.setData(ui->lineEdit_W_Sschool->text());
        node6.appendChild(domText6);
        itemRootElement.appendChild(node6);

        QDomElement node7 = domDoc.createElement("SAge");
        QDomText domText7 = domDoc.createTextNode("SAge");
        domText7.setData(QString::number(ui->lineEdit_W_Sage->text().toInt()));
        node7.appendChild(domText7);
        itemRootElement.appendChild(node7);
    }

    domRootElement.appendChild(itemRootElement);                        //绑定到顶结点
    m_file.write(domDoc.toString().toLocal8Bit().data());
    m_file.close();
}

void ReadWriteXml::readXml()
{
    if(!openXml(currFileName))
    {
        qDebug() << " Read Open false";
        return;
    }
    qDebug() << " Read Open true";

    QDomDocument doc;
    if(!doc.setContent(&m_file))
    {
        m_file.close();
        qDebug() << " Read Open Xml false";
        return;
    }
    qDebug() << " Read Open Xml true";

    QDomElement root = doc.documentElement();           //读取根节点
    QDomNode node = root.firstChild();                  //读取第一个父节点

    while(!node.isNull())
    {
        QDomNodeList sonList = node.childNodes();       //读取子结点集合
        QString rootName = node.toElement().tagName();  //读取父节点名字
        if(rootName.compare("teacher") == 0)
        {
            readRootXml(sonList);                       //将子结点集合传进去读取子结点数据
        }
        node = node.nextSibling();                      //读取下一父节点
    }

}

void ReadWriteXml::readRootXml(QDomNodeList sonNodeList)
{
    for(int sonNode = 0;sonNode < sonNodeList.size();sonNode++)
    {
        QDomElement sonElement = sonNodeList.at(sonNode).toElement();       //获取子结点
        if(sonElement.toElement().tagName().compare("TName") == 0)          //与取出子结点进行对比
        {
            ui->lineEdit_R_Tname->setText(sonElement.text());
        }
        else if(sonElement.toElement().tagName().compare("TSchool") == 0)
        {
            ui->lineEdit_R_Tclass->setText(sonElement.text());
        }
        else if(sonElement.toElement().tagName().compare("TAge") == 0)
        {
            ui->lineEdit_R_Tage->setText(QString::number(sonElement.text().toInt()));
        }
        else if(sonElement.toElement().tagName().compare("TSubject") == 0)
        {
            ui->lineEdit_R_Tsubject->setText(sonElement.text());
        }
        else if(sonElement.toElement().tagName().compare("SName") == 0)
        {
            ui->lineEdit_R_Sname->setText(sonElement.text());
        }
        else if(sonElement.toElement().tagName().compare("SSchool") == 0)
        {
            ui->lineEdit_R_Sschool->setText(sonElement.text());
        }
        else if(sonElement.toElement().tagName().compare("SAge") == 0)
        {
            ui->lineEdit_R_Sage->setText(QString::number(sonElement.text().toInt()));
        }
    }
}


void ReadWriteXml::on_pushButton_write_clicked()
{
    writeXml();
}

void ReadWriteXml::on_pushButton_read_clicked()
{
    readXml();
}

运行效果图:

在这里插入图片描述
在这里插入图片描述

over:

欢迎大家关注作者在文末评论、点赞、转发以及批评指正!
如果大家有更好的方法或有问题可以在文末评论一起讨论!
共同学习!
共同进步!

文末一句话:

人活一生,谁不想有一番成就呢?
这世间,没有无缘无故的成功,也没有不明不白的失败。
凡成功者,都是根据自己的长处来确定并坚持自己的人生方向。
善于利用自己的优点和长处,回避自己的弱点和短处,然后如愿以偿地实现了梦想。
成功者在发迹之前,都会 “断舍离” 三样东西。
曾国藩讲:
“百种弊病,皆从懒生。懒则弛缓,弛缓则治人不严,而趣功不敏,一处迟则百处懈矣。”
土地荒芜,便杂草丛生。房屋闲置,便布满灰尘。人若懒惰,便一事无成。

朱熹曾说:
“不奋发,则心日颓靡;不检束,则心日恣肆。”

《论语•子罕》中孔子有一句著名的话:
“岁寒,然后知松柏之后凋也。“

《孙子·九地》中有言:
“投之亡地而后存,陷之死地然后生。”

————————————————————————————不以物喜,不以己悲

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值