概述:
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:
欢迎大家关注作者在文末评论、点赞、转发以及批评指正!
如果大家有更好的方法或有问题可以在文末评论一起讨论!
共同学习!
共同进步!
文末一句话:
人活一生,谁不想有一番成就呢?
这世间,没有无缘无故的成功,也没有不明不白的失败。
凡成功者,都是根据自己的长处来确定并坚持自己的人生方向。
善于利用自己的优点和长处,回避自己的弱点和短处,然后如愿以偿地实现了梦想。
成功者在发迹之前,都会 “断舍离” 三样东西。
曾国藩讲:
“百种弊病,皆从懒生。懒则弛缓,弛缓则治人不严,而趣功不敏,一处迟则百处懈矣。”
土地荒芜,便杂草丛生。房屋闲置,便布满灰尘。人若懒惰,便一事无成。
朱熹曾说:
“不奋发,则心日颓靡;不检束,则心日恣肆。”
《论语•子罕》中孔子有一句著名的话:
“岁寒,然后知松柏之后凋也。“
《孙子·九地》中有言:
“投之亡地而后存,陷之死地然后生。”
————————————————————————————不以物喜,不以己悲