Qt xml操作的實(shí)現(xiàn)
更新時間:2024年04月30日 09:22:12 作者:陌小呆^O^
本文主要介紹Qt xml操作的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
1.數(shù)據(jù)格式
#ifndef XML_DATA_H
#define XML_DATA_H
#include<QWidget>
struct Student
{
int s_id;
QString s_name;
double s_math_score;
double s_english_score;
};
struct Teacher{
int t_id;
QString t_name;
QVector<Student> t_students_v;
};
#endif // XML_DATA_H
2.xml示范
2.1 .h文件
#ifndef XML_EXAMPLE1_H
#define XML_EXAMPLE1_H
#include <QObject>
#include"XML_Data.h"
#include <QtXml>
#include <QString>
#include <QDebug>
#include"tinyxml2.h"
class Xml_Example1 : public QObject
{
Q_OBJECT
public:
explicit Xml_Example1(QObject *parent = nullptr);
void saveXml_doc(const Student& stu,const QString& filePath);
void saveXml_writer(const Student& stu,const QString& filePath);
void saveXml_tinyxml2(const Student& stu,const QString& filePath);
void saveXml_doc(const Teacher& tea,const QString& filePath);
void saveXml_writer(const Teacher& tea,const QString& filePath);
void saveXml_tinyxml2(const Teacher& tea,const QString& filePath);
void loadXml_doc(Student& stu,const QString& filePath);
void loadXml_tinyxml2(Student& stu,const QString& filePath);
void loadXml_doc(Teacher& tea,const QString& filePath);
void loadXml_tinyxml2(Teacher& tea,const QString& filePath);
signals:
};
#endif // XML_EXAMPLE1_H
2.2 .cpp文件
#include "xml_example1.h"
Xml_Example1::Xml_Example1(QObject *parent)
: QObject{parent}
{}
void Xml_Example1::saveXml_doc(const Student &stu, const QString &filePath)
{
QDomDocument doc;
// 創(chuàng)建根節(jié)點(diǎn)
QDomElement root = doc.createElement("Student");
doc.appendChild(root);
// 創(chuàng)建子節(jié)點(diǎn)并設(shè)置屬性
QDomElement id = doc.createElement("ID");
id.appendChild(doc.createTextNode(QString::number(stu.s_id)));
root.appendChild(id);
QDomElement name = doc.createElement("Name");
name.appendChild(doc.createTextNode(stu.s_name));
root.appendChild(name);
QDomElement math_score = doc.createElement("MathScore");
math_score.appendChild(doc.createTextNode(QString::number(stu.s_math_score)));
root.appendChild(math_score);
QDomElement english_score = doc.createElement("EnglishScore");
english_score.appendChild(doc.createTextNode(QString::number(stu.s_english_score)));
root.appendChild(english_score);
// 保存到文件
QFile file(filePath);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
qDebug() << "Failed to open file for writing.";
return;
}
QTextStream out(&file);
// out.setCodec("UTF-8");
doc.save(out, 4);
file.close();
}
void Xml_Example1::saveXml_writer(const Student &stu, const QString &filePath)
{
QFile file(filePath);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
qDebug() << "Failed to open file for writing.";
return;
}
QXmlStreamWriter xmlWriter(&file);
xmlWriter.setAutoFormatting(true); // 設(shè)置自動格式化,使XML文檔更易讀
xmlWriter.writeStartDocument();
xmlWriter.writeStartElement("Student");
xmlWriter.writeTextElement("ID", QString::number(stu.s_id));
xmlWriter.writeTextElement("Name", stu.s_name);
xmlWriter.writeTextElement("MathScore", QString::number(stu.s_math_score));
xmlWriter.writeTextElement("EnglishScore", QString::number(stu.s_english_score));
xmlWriter.writeEndElement(); // 結(jié)束Student節(jié)點(diǎn)
xmlWriter.writeEndDocument();
file.close();
}
void Xml_Example1::saveXml_tinyxml2(const Student &stu, const QString &filePath)
{
// 創(chuàng)建一個 XML 文檔對象
tinyxml2::XMLDocument doc;
// 創(chuàng)建根節(jié)點(diǎn)
tinyxml2::XMLElement* root = doc.NewElement("Student");
doc.InsertEndChild(root);
// 添加學(xué)生信息作為子節(jié)點(diǎn)
tinyxml2::XMLElement* idElement = doc.NewElement("ID");
idElement->SetText(stu.s_id);
root->InsertEndChild(idElement);
tinyxml2::XMLElement* nameElement = doc.NewElement("Name");
nameElement->SetText(stu.s_name.toStdString().c_str());
root->InsertEndChild(nameElement);
tinyxml2::XMLElement* mathScoreElement = doc.NewElement("MathScore");
mathScoreElement->SetText(stu.s_math_score);
root->InsertEndChild(mathScoreElement);
tinyxml2::XMLElement* englishScoreElement = doc.NewElement("EnglishScore");
englishScoreElement->SetText(stu.s_english_score);
root->InsertEndChild(englishScoreElement);
// 保存 XML 文檔到文件
doc.SaveFile(filePath.toStdString().c_str());
}
void Xml_Example1::saveXml_doc(const Teacher &tea, const QString &filePath)
{
// 創(chuàng)建 QDomDocument 對象
QDomDocument doc;
// 創(chuàng)建根元素 <Teacher>
QDomElement root = doc.createElement("Teacher");
doc.appendChild(root);
// 創(chuàng)建子元素 <ID> 和 <Name>,并添加到 <Teacher> 中
QDomElement idElement = doc.createElement("ID");
QDomText idText = doc.createTextNode(QString::number(tea.t_id));
idElement.appendChild(idText);
root.appendChild(idElement);
QDomElement nameElement = doc.createElement("Name");
QDomText nameText = doc.createTextNode(tea.t_name);
nameElement.appendChild(nameText);
root.appendChild(nameElement);
// 創(chuàng)建子元素 <Student>,并添加到 <Teacher> 中
for (const auto &stu : tea.t_students_v)
{
QDomElement studentElement = doc.createElement("Student");
QDomElement stuIdElement = doc.createElement("ID");
QDomText stuIdText = doc.createTextNode(QString::number(stu.s_id));
stuIdElement.appendChild(stuIdText);
studentElement.appendChild(stuIdElement);
QDomElement stuNameElement = doc.createElement("Name");
QDomText stuNameText = doc.createTextNode(stu.s_name);
stuNameElement.appendChild(stuNameText);
studentElement.appendChild(stuNameElement);
QDomElement mathScoreElement = doc.createElement("MathScore");
QDomText mathScoreText = doc.createTextNode(QString::number(stu.s_math_score));
mathScoreElement.appendChild(mathScoreText);
studentElement.appendChild(mathScoreElement);
QDomElement englishScoreElement = doc.createElement("EnglishScore");
QDomText englishScoreText = doc.createTextNode(QString::number(stu.s_english_score));
englishScoreElement.appendChild(englishScoreText);
studentElement.appendChild(englishScoreElement);
root.appendChild(studentElement);
}
// 將 QDomDocument 寫入文件
QFile file(filePath);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
qDebug() << "無法打開文件" << filePath;
return;
}
QTextStream out(&file);
// out.setCodec("UTF-8");
doc.save(out, 4); // 縮進(jìn)格式為4
file.close();
}
void Xml_Example1::saveXml_writer(const Teacher &tea, const QString &filePath)
{
// 創(chuàng)建文件對象
QFile file(filePath);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
qDebug() << "無法打開文件" << filePath;
return;
}
// 創(chuàng)建 XML 寫入器
QXmlStreamWriter xmlWriter(&file);
xmlWriter.setAutoFormatting(true); // 設(shè)置自動格式化,便于閱讀
// 開始寫入 XML
xmlWriter.writeStartDocument();
xmlWriter.writeStartElement("Teacher");
// 寫入教師信息
xmlWriter.writeTextElement("ID", QString::number(tea.t_id));
xmlWriter.writeTextElement("Name", tea.t_name);
// 寫入學(xué)生信息
for (const auto &stu : tea.t_students_v)
{
xmlWriter.writeStartElement("Student");
xmlWriter.writeTextElement("ID", QString::number(stu.s_id));
xmlWriter.writeTextElement("Name", stu.s_name);
xmlWriter.writeTextElement("MathScore", QString::number(stu.s_math_score));
xmlWriter.writeTextElement("EnglishScore", QString::number(stu.s_english_score));
xmlWriter.writeEndElement(); // 關(guān)閉<Student>節(jié)點(diǎn)
}
// 結(jié)束寫入 XML
xmlWriter.writeEndElement(); // 關(guān)閉<Teacher>節(jié)點(diǎn)
xmlWriter.writeEndDocument();
// 關(guān)閉文件
file.close();
}
void Xml_Example1::saveXml_tinyxml2(const Teacher &tea, const QString &filePath)
{
// 創(chuàng)建一個 XML 文檔對象
tinyxml2::XMLDocument doc;
// 創(chuàng)建根節(jié)點(diǎn)
tinyxml2::XMLElement *root = doc.NewElement("Teacher");
doc.InsertEndChild(root);
// 添加教師信息作為子節(jié)點(diǎn)
tinyxml2::XMLElement *idElement = doc.NewElement("ID");
idElement->SetText(tea.t_id);
root->InsertEndChild(idElement);
tinyxml2::XMLElement *nameElement = doc.NewElement("Name");
nameElement->SetText(tea.t_name.toStdString().c_str());
root->InsertEndChild(nameElement);
// 添加學(xué)生信息作為子節(jié)點(diǎn)
for (const auto &stu : tea.t_students_v)
{
tinyxml2::XMLElement *studentElement = doc.NewElement("Student");
root->InsertEndChild(studentElement);
tinyxml2::XMLElement *idElement = doc.NewElement("ID");
idElement->SetText(stu.s_id);
studentElement->InsertEndChild(idElement);
tinyxml2::XMLElement *nameElement = doc.NewElement("Name");
nameElement->SetText(stu.s_name.toStdString().c_str());
studentElement->InsertEndChild(nameElement);
tinyxml2::XMLElement *mathScoreElement = doc.NewElement("MathScore");
mathScoreElement->SetText(stu.s_math_score);
studentElement->InsertEndChild(mathScoreElement);
tinyxml2::XMLElement *englishScoreElement = doc.NewElement("EnglishScore");
englishScoreElement->SetText(stu.s_english_score);
studentElement->InsertEndChild(englishScoreElement);
}
// 保存 XML 文檔到文件
doc.SaveFile(filePath.toStdString().c_str());
}
void Xml_Example1::loadXml_doc(Student &stu, const QString &filePath)
{
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
// 文件無法打開
qDebug()<<"文件無法打開";
return;
}
QDomDocument xml_doc;
if (!xml_doc.setContent(&file))
{
// XML 解析失敗
qDebug()<<"XML 解析失敗";
file.close();
return;
}
QDomElement root = xml_doc.documentElement();
stu.s_id = root.firstChildElement("ID").text().toInt();
stu.s_name = root.firstChildElement("Name").text();
stu.s_math_score = root.firstChildElement("MathScore").text().toDouble();
stu.s_english_score = root.firstChildElement("EnglishScore").text().toDouble();
file.close();
}
void Xml_Example1::loadXml_tinyxml2(Student &stu, const QString &filePath)
{
// 創(chuàng)建一個 XML 文檔對象
tinyxml2::XMLDocument doc;
// 加載 XML 文件
if(doc.LoadFile(filePath.toStdString().c_str()) != tinyxml2::XML_SUCCESS) {
qDebug() << "Error loading XML file.";
return;
}
// 獲取根節(jié)點(diǎn)
tinyxml2::XMLElement* root = doc.FirstChildElement("Student");
if(!root) {
qDebug() << "Root element 'Student' not found.";
return;
}
// 解析子節(jié)點(diǎn)并填充到Student對象
stu.s_id = root->FirstChildElement("ID")->IntText();
const char* name = root->FirstChildElement("Name")->GetText();
stu.s_name = QString(name);
stu.s_math_score = root->FirstChildElement("MathScore")->IntText();
stu.s_english_score = root->FirstChildElement("EnglishScore")->IntText();
}
void Xml_Example1::loadXml_doc(Teacher &tea, const QString &filePath)
{
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
// 文件無法打開
qDebug()<<"文件無法打開";
return;
}
QDomDocument xml_doc;
if (!xml_doc.setContent(&file))
{
// XML 解析失敗
qDebug()<<"XML 解析失敗";
file.close();
return;
}
QDomElement root = xml_doc.documentElement();
tea.t_id=root.firstChildElement("ID").text().toInt();
tea.t_name=root.firstChildElement("Name").text();
QDomNodeList studentList = root.elementsByTagName("Student");
for(int i=0; i<studentList.count(); i++)
{
QDomElement studentElement = studentList.at(i).toElement();
Student student;
student.s_id=(studentElement.firstChildElement("ID").text().toInt());
student.s_name=(studentElement.firstChildElement("Name").text());
student.s_math_score=(studentElement.firstChildElement("MathScore").text().toDouble());
student.s_english_score=(studentElement.firstChildElement("EnglishScore").text().toDouble());
// 將學(xué)生對象添加到教師對象中
tea.t_students_v.append(student);
}
}
void Xml_Example1::loadXml_tinyxml2(Teacher &tea, const QString &filePath)
{
// 創(chuàng)建一個 XML 文檔對象
tinyxml2::XMLDocument doc;
// 加載 XML 文件
if(doc.LoadFile(filePath.toStdString().c_str()) != tinyxml2::XML_SUCCESS) {
qDebug() << "Error loading XML file.";
return;
}
// 獲取根節(jié)點(diǎn)
tinyxml2::XMLElement* root = doc.FirstChildElement("Teacher");
if(!root) {
qDebug() << "Root element 'Teacher' not found.";
return;
}
// 解析子節(jié)點(diǎn)并填充到Teacher對象
tea.t_id = root->FirstChildElement("ID")->IntText();
tea.t_name = QString(root->FirstChildElement("Name")->GetText());
// 讀取每個學(xué)生的信息
for(tinyxml2::XMLElement* student = root->FirstChildElement("Student"); student; student = student->NextSiblingElement("Student")) {
Student s;
// 解析學(xué)生的ID, Name, MathScore, 和 EnglishScore
student->FirstChildElement("ID")->QueryIntText(&s.s_id);
s.s_name = student->FirstChildElement("Name")->GetText();
student->FirstChildElement("MathScore")->QueryDoubleText(&s.s_math_score);
student->FirstChildElement("EnglishScore")->QueryDoubleText(&s.s_english_score);
tea.t_students_v.append(s);
// 將學(xué)生信息存儲起來,這里的處理方式取決于具體的Teacher和Student的定義
// 此處假設(shè)Teacher類和Student類已經(jīng)定義,且有適當(dāng)?shù)姆椒▉泶鎯@些信息
}
// 獲取學(xué)生節(jié)點(diǎn)
// tinyxml2::XMLElement* studentElement = root->FirstChildElement("Students");
// if(!studentElement) {
// qDebug() << "Element 'Students' not found.";
// return;
// }
// tinyxml2::XMLNode* studetsNode=root->
// 解析學(xué)生節(jié)點(diǎn)
// for(tinyxml2::XMLElement* studentNode = studentElement->FirstChildElement("Student");
// studentNode;
// studentNode = studentNode->NextSiblingElement("Student")) {
// Student stu;
// stu.s_id = studentNode->FirstChildElement("ID")->IntText();
// stu.s_name = QString(studentNode->FirstChildElement("Name")->GetText());
// stu.s_math_score = studentNode->FirstChildElement("MathScore")->DoubleText();
// stu.s_english_score = studentNode->FirstChildElement("EnglishScore")->DoubleText();
// // 將學(xué)生添加到老師的學(xué)生列表中
// tea.t_students_v.push_back(stu);
// }
}
3.測試
#include "widget.h"
#include <QApplication>
#include"xml_example1.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
Xml_Example1 x_e;
Student stu;
stu.s_id = 1;
stu.s_name = "張三";
stu.s_math_score = 90.5;
stu.s_english_score = 85.3;
Student stu2;
stu2.s_id = 1;
stu2.s_name = "張埃里克";
stu2.s_math_score = 90.5;
stu2.s_english_score = 85.3;
Teacher t;
t.t_id=11;
t.t_name="tea";
t.t_students_v.append(stu);
t.t_students_v.append(stu2);
x_e.saveXml_doc(stu, "student_doc.xml");
x_e.saveXml_writer(stu, "student_writer.xml");
x_e.saveXml_tinyxml2(stu, "student_tinyxml2.xml");
x_e.saveXml_doc(t, "teacher_doc.xml");
x_e.saveXml_writer(t, "teacher_writer.xml");
x_e.saveXml_tinyxml2(t, "teacher_tinyxml2.xml");
Student s3;
// x_e.loadXml_doc(s3,"student_doc.xml");
x_e.loadXml_tinyxml2(s3,"student_tinyxml2.xml");
// qDebug()<<s3.s_name<<s3.s_english_score<<s3.s_math_score<<s3.s_id;
Teacher t3;
x_e.loadXml_doc(t3,"teacher_tinyxml2.xml");
qDebug()<<t3.t_id<<t3.t_name<<t3.t_students_v.size();
return a.exec();
}
4.效果圖


到此這篇關(guān)于Qt xml操作的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Qt xml操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入分析為Visual Assist設(shè)置快捷鍵的方法
本篇文章是對為Visual Assist設(shè)置快捷鍵的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C 語言基礎(chǔ)實(shí)現(xiàn)青蛙跳臺階和漢諾塔問題
這篇文章我們九里講講C 語言基礎(chǔ)實(shí)現(xiàn)青蛙跳臺階和漢諾塔問題,感興趣的小伙伴可以參考下面文章的具體內(nèi)容2021-09-09
C++實(shí)現(xiàn)LeetCode(91.解碼方法)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(91.解碼方法),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C語言中結(jié)構(gòu)體(struct)的幾種初始化方法
相信大家都知道struct結(jié)構(gòu)體是C語言中非常重要的復(fù)合類型,初始化的方法很多,那么小編下面對這些方法進(jìn)行總結(jié),便于自己和大家以后查閱,有需要的可以參考借鑒。2016-08-08
C語言使用realloc函數(shù)實(shí)現(xiàn)通訊錄源碼分析
什么是動態(tài)通訊錄,就是在靜態(tài)的基礎(chǔ)上改進(jìn)了一下,不在使用數(shù)組,而是使用指針和動態(tài)內(nèi)存開辟的函數(shù),當(dāng)空間不夠的時候,便進(jìn)行增容2023-02-02

