自学内容网 自学内容网

qt-xml文件操作

一、xml说明

XML(eXtensible Markup Language)文件因其结构化和易于理解的特性,被广泛用于数据交换和存储。Qt框架提供了强大的支持来处理XML文件,主要包括DOM(Document Object Model)和SAX(Simple API for XML)两种解析方式,以及从Qt 4.3开始引入的基于流的QXmlStreamReader和QXmlStreamWriter类。本文将详细介绍如何使用Qt的DOM方法来进行XML文件的创建、读取、添加、删除和更新操作。


二、工程文件依赖和头文件

1.依赖和头文件

#include <QDomDocument>

2.ui界面

三、写入xml文件

1.头文件

#ifndef WRITEREADXML_H
#define WRITEREADXML_H

#include <QDialog>
#include <QDomDocument>
#include <QFile>
#include <QDir>
#include <QMessageBox>
#include <QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class writereadxml; }
QT_END_NAMESPACE

class writereadxml : public QDialog
{
    Q_OBJECT

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

private:
    Ui::writereadxml *ui;

    QFile m_file;
    QString strcurrentfilepath;
    QString strcurrentfilename;

public:
    bool openxmlfile(const QString filename);     //打开xml文件
    void writexml();                              //写入xml
    void readxml();                               //读取xml文件
    void readrootxml(QDomNodeList sonnodelist);   //读取xml根节点

private slots:
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();
};
#endif // WRITEREADXML_H

2.写入文件

2.1在构造函数中定义xml路径

    strcurrentfilepath = "d:/xmlfiles";
    strcurrentfilename = "/wrxmlfile.xml";

2.2打开文件

bool writereadxml::openxmlfile(const QString filename)     //打开xml文件
{
    m_file.setFileName(strcurrentfilepath+filename);
    return m_file.open(QIODevice::ReadWrite|QIODevice::Text);
}

2.3写入文件操作

创建一个xml对象,添加xml版本号和编码格式,然后添加节点,节点依次为顶层节点、根节点、以及根节点下的元素

void writereadxml::writexml()                              //写入xml
{
    if(!openxmlfile(strcurrentfilename)){
        qDebug()<<"写入:创建失败";
    }
    qDebug()<<"写入:文件创建成功";

    QDomDocument document;  //创建对象
    QDomProcessingInstruction version;  //用于写入xml头部信息
    version = document.createProcessingInstruction("xml", "version = \"1.0\" encoding = \"GB2312\"");
    document.appendChild(version);

    //添加第一个子节点及相关子元素
    QDomElement domrootelement = document.createElement("factory"); //创建顶层节点
    document.appendChild(domrootelement);

    QDomElement itemrootelement = document.createElement("niuma");     //创建根节点
    {
        //创建子元素1
        QDomElement node1 = document.createElement("NMNo");
        QDomText domtext1 = document.createTextNode("NMNo");
        domtext1.setData(ui->lineEditNo->text());
        node1.appendChild(domtext1);
        itemrootelement.appendChild(node1);

        //2
        QDomElement node2 = document.createElement("NMName");
        QDomText domtext2 = document.createTextNode("NMName");
        domtext2.setData(ui->lineEditName->text());
        node2.appendChild(domtext2);
        itemrootelement.appendChild(node2);


        //3
        QDomElement node3 = document.createElement("NMSex");
        QDomText domtext3 = document.createTextNode("NMSex");
        domtext3.setData(ui->lineEditSex->text());
        node3.appendChild(domtext3);
        itemrootelement.appendChild(node3);


        //4
        QDomElement node4 = document.createElement("NMAge");
        QDomText domtext4 = document.createTextNode("NMAge");
        domtext4.setData(ui->lineEditAge->text());
        node4.appendChild(domtext4);
        itemrootelement.appendChild(node4);

        //5
        QDomElement node5 = document.createElement("NMSalary");
        QDomText domtext5 = document.createTextNode("NMSalary");
        domtext5.setData(ui->lineEditSalary->text());
        node5.appendChild(domtext5);
        itemrootelement.appendChild(node5);

        //6
        QDomElement node6 = document.createElement("NMSkill");
        QDomText domtext6 = document.createTextNode("NMSkill");
        domtext6.setData(ui->lineEditSkill->text());
        node6.appendChild(domtext6);
        itemrootelement.appendChild(node6);
    }

    domrootelement.appendChild(itemrootelement);
    m_file.write(document.toString().toLocal8Bit().data());
    m_file.close();

}

四、读取文件

1.读取文件操作

首先打开已存在的xml文件,创建dom对象接收,创建节点获取根节点,解析根节点内容。

void writereadxml::readxml()                               //读取xml文件
{
    if(!openxmlfile(strcurrentfilename)){
        qDebug()<<"读取:创建失败";
    }
    qDebug()<<"读取:文件创建成功";
    QDomDocument document;    //创建接收对象
    if(!document.setContent(&m_file)){
        m_file.close();
        qDebug()<<"读取:setcontent失败";
        return;
    }
    qDebug()<<"读取:setcontent成功";

    //创建节点,用于接收根节点
    QDomElement rootelement = document.documentElement();

    //获取第一个父亲节点
    QDomNode node = rootelement.firstChild();
    while(!node.isNull()){
        QDomNodeList nodelist = node.childNodes();         //获取子节点集
        QString nodename = node.toElement().tagName();     //获取父亲节点的名称
        if(nodename.compare("niuma") == 0){
            readrootxml(nodelist);
        }
        node = node.nextSibling();
    }

}

 解析子节点集显示数据到界面

void writereadxml::readrootxml(QDomNodeList sonnodelist)   //读取xml子节点
{
    for(int i = 0; i < sonnodelist.size(); i++){
        QDomElement nodeelement = sonnodelist.at(i).toElement();
        if(nodeelement.tagName().compare("NMNo") == 0){
            ui->lineEditNo_R->setText(nodeelement.text());
        }else if(nodeelement.tagName().compare("NMName") == 0){
            ui->lineEditName_R->setText(nodeelement.text());
        }else if(nodeelement.tagName().compare("NMSex") == 0){
            ui->lineEditSex_R->setText(nodeelement.text());
        }else if(nodeelement.tagName().compare("NMAge") == 0){
            ui->lineEditAge_R->setText(nodeelement.text());
        }else if(nodeelement.tagName().compare("NMSalary") == 0){
            ui->lineEditSalary_R->setText(nodeelement.text());
        }else if(nodeelement.tagName().compare("NMSkill") == 0){
            ui->lineEditSkill_R->setText(nodeelement.text());
        }
    }
}

                 


原文地址:https://blog.csdn.net/qq_57041630/article/details/143568835

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!