Qt xml操作的實(shí)現(xiàn)
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è)置自動(dòng)格式化,使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)建一個(gè) XML 文檔對(duì)象 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 對(duì)象 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 寫(xiě)入文件 QFile file(filePath); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { qDebug() << "無(wú)法打開(kāi)文件" << 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)建文件對(duì)象 QFile file(filePath); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { qDebug() << "無(wú)法打開(kāi)文件" << filePath; return; } // 創(chuàng)建 XML 寫(xiě)入器 QXmlStreamWriter xmlWriter(&file); xmlWriter.setAutoFormatting(true); // 設(shè)置自動(dòng)格式化,便于閱讀 // 開(kāi)始寫(xiě)入 XML xmlWriter.writeStartDocument(); xmlWriter.writeStartElement("Teacher"); // 寫(xiě)入教師信息 xmlWriter.writeTextElement("ID", QString::number(tea.t_id)); xmlWriter.writeTextElement("Name", tea.t_name); // 寫(xiě)入學(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é)束寫(xiě)入 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)建一個(gè) XML 文檔對(duì)象 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)) { // 文件無(wú)法打開(kāi) qDebug()<<"文件無(wú)法打開(kāi)"; 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)建一個(gè) XML 文檔對(duì)象 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對(duì)象 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)) { // 文件無(wú)法打開(kāi) qDebug()<<"文件無(wú)法打開(kāi)"; 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é)生對(duì)象添加到教師對(duì)象中 tea.t_students_v.append(student); } } void Xml_Example1::loadXml_tinyxml2(Teacher &tea, const QString &filePath) { // 創(chuàng)建一個(gè) XML 文檔對(duì)象 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對(duì)象 tea.t_id = root->FirstChildElement("ID")->IntText(); tea.t_name = QString(root->FirstChildElement("Name")->GetText()); // 讀取每個(gè)學(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é)生信息存儲(chǔ)起來(lái),這里的處理方式取決于具體的Teacher和Student的定義 // 此處假設(shè)Teacher類和Student類已經(jīng)定義,且有適當(dāng)?shù)姆椒▉?lái)存儲(chǔ)這些信息 } // 獲取學(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.測(cè)試
#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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入分析為Visual Assist設(shè)置快捷鍵的方法
本篇文章是對(duì)為Visual Assist設(shè)置快捷鍵的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C 語(yǔ)言基礎(chǔ)實(shí)現(xiàn)青蛙跳臺(tái)階和漢諾塔問(wèn)題
這篇文章我們九里講講C 語(yǔ)言基礎(chǔ)實(shí)現(xiàn)青蛙跳臺(tái)階和漢諾塔問(wèn)題,感興趣的小伙伴可以參考下面文章的具體內(nèi)容2021-09-09C++實(shí)現(xiàn)LeetCode(91.解碼方法)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(91.解碼方法),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語(yǔ)言中結(jié)構(gòu)體(struct)的幾種初始化方法
相信大家都知道struct結(jié)構(gòu)體是C語(yǔ)言中非常重要的復(fù)合類型,初始化的方法很多,那么小編下面對(duì)這些方法進(jìn)行總結(jié),便于自己和大家以后查閱,有需要的可以參考借鑒。2016-08-086個(gè)變態(tài)的C語(yǔ)言Hello World程序
這篇文章主要介紹了6個(gè)變態(tài)的C語(yǔ)言Hello World程序,需要的朋友可以參考下2016-05-05C++11計(jì)時(shí)器之chrono庫(kù)簡(jiǎn)介
C++11有了chrono庫(kù),可以在不同系統(tǒng)中很容易的實(shí)現(xiàn)定時(shí)功能,要使用chrono庫(kù),需要#include,其所有實(shí)現(xiàn)均在std::chrono namespace下,本文給大家介紹C++11計(jì)時(shí)器:chrono庫(kù)介紹,感興趣的朋友一起看看吧2023-12-12C語(yǔ)言使用realloc函數(shù)實(shí)現(xiàn)通訊錄源碼分析
什么是動(dòng)態(tài)通訊錄,就是在靜態(tài)的基礎(chǔ)上改進(jìn)了一下,不在使用數(shù)組,而是使用指針和動(dòng)態(tài)內(nèi)存開(kāi)辟的函數(shù),當(dāng)空間不夠的時(shí)候,便進(jìn)行增容2023-02-02