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)!