最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt xml操作的實現(xiàn)

 更新時間:2024年04月30日 09:22:12   作者:陌小呆^O^  
本文主要介紹Qt xml操作的實現(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é)點
    QDomElement root = doc.createElement("Student");
    doc.appendChild(root);

    // 創(chuàng)建子節(jié)點并設置屬性
    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); // 設置自動格式化,使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(); // 結束Student節(jié)點
    xmlWriter.writeEndDocument();

    file.close();
}

void Xml_Example1::saveXml_tinyxml2(const Student &stu, const QString &filePath)
{
    // 創(chuàng)建一個 XML 文檔對象
    tinyxml2::XMLDocument doc;

    // 創(chuàng)建根節(jié)點
    tinyxml2::XMLElement* root = doc.NewElement("Student");
    doc.InsertEndChild(root);

    // 添加學生信息作為子節(jié)點
    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); // 縮進格式為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); // 設置自動格式化,便于閱讀

    // 開始寫入 XML
    xmlWriter.writeStartDocument();
    xmlWriter.writeStartElement("Teacher");

    // 寫入教師信息
    xmlWriter.writeTextElement("ID", QString::number(tea.t_id));
    xmlWriter.writeTextElement("Name", tea.t_name);

    // 寫入學生信息
    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(); // 關閉<Student>節(jié)點
    }

    // 結束寫入 XML
    xmlWriter.writeEndElement(); // 關閉<Teacher>節(jié)點
    xmlWriter.writeEndDocument();

    // 關閉文件
    file.close();
}

void Xml_Example1::saveXml_tinyxml2(const Teacher &tea, const QString &filePath)
{
    // 創(chuàng)建一個 XML 文檔對象
    tinyxml2::XMLDocument doc;

    // 創(chuàng)建根節(jié)點
    tinyxml2::XMLElement *root = doc.NewElement("Teacher");
    doc.InsertEndChild(root);

    // 添加教師信息作為子節(jié)點
    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);

    // 添加學生信息作為子節(jié)點
    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é)點
    tinyxml2::XMLElement* root = doc.FirstChildElement("Student");
    if(!root) {
        qDebug() << "Root element 'Student' not found.";
        return;
    }

    // 解析子節(jié)點并填充到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());

        // 將學生對象添加到教師對象中
        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é)點
    tinyxml2::XMLElement* root = doc.FirstChildElement("Teacher");
    if(!root) {
        qDebug() << "Root element 'Teacher' not found.";
        return;
    }

    // 解析子節(jié)點并填充到Teacher對象
    tea.t_id = root->FirstChildElement("ID")->IntText();
    tea.t_name = QString(root->FirstChildElement("Name")->GetText());

    // 讀取每個學生的信息
    for(tinyxml2::XMLElement* student = root->FirstChildElement("Student"); student; student = student->NextSiblingElement("Student")) {

        Student s;

        // 解析學生的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);
        // 將學生信息存儲起來,這里的處理方式取決于具體的Teacher和Student的定義
        // 此處假設Teacher類和Student類已經(jīng)定義,且有適當?shù)姆椒▉泶鎯@些信息

    }


    // 獲取學生節(jié)點
    // tinyxml2::XMLElement* studentElement = root->FirstChildElement("Students");
    // if(!studentElement) {
    //     qDebug() << "Element 'Students' not found.";
    //     return;
    // }

    // tinyxml2::XMLNode* studetsNode=root->

    // 解析學生節(jié)點
    // 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();

    //     // 將學生添加到老師的學生列表中
    //     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.效果圖

 到此這篇關于Qt xml操作的實現(xiàn)的文章就介紹到這了,更多相關Qt xml操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言由淺入深理解指針

    C語言由淺入深理解指針

    C語言這門課程在計算機的基礎教學中一直占有比較重要的地位,然而要想突破C語言的學習,對指針的掌握是非常重要的,本文將具體針對指針的基礎做詳盡的介紹
    2022-05-05
  • C++集體數(shù)據(jù)交換實現(xiàn)示例講解

    C++集體數(shù)據(jù)交換實現(xiàn)示例講解

    這篇文章主要介紹了C++集體數(shù)據(jù)交換實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-11-11
  • MFC實現(xiàn)連連看游戲之地圖顯示

    MFC實現(xiàn)連連看游戲之地圖顯示

    這篇文章主要為大家詳細介紹了MFC實現(xiàn)連連看游戲之地圖顯示,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C語言實現(xiàn)獲取內(nèi)存信息并輸出的實例

    C語言實現(xiàn)獲取內(nèi)存信息并輸出的實例

    這篇文章主要介紹了C語言實現(xiàn)獲取內(nèi)存信息并輸出的實例的相關資料,需要的朋友可以參考下
    2017-03-03
  • C語言?sizeof關鍵字的具體使用

    C語言?sizeof關鍵字的具體使用

    在C語言中,sizeof是一個非常常用的關鍵字,本文主要介紹了C語言?sizeof關鍵字的具體使用,包括sizeof 關鍵字的語法、用法、特點和注意事項,感興趣的可以了解一下
    2024-02-02
  • C++如何實現(xiàn)廣義表詳解

    C++如何實現(xiàn)廣義表詳解

    廣義表是非線性結構,其定義是遞歸的。那么下面跟著小編一起看看如何用C++實現(xiàn)廣義表,有需要的可以參考借鑒。
    2016-08-08
  • C語言 數(shù)據(jù)結構之中序二叉樹實例詳解

    C語言 數(shù)據(jù)結構之中序二叉樹實例詳解

    這篇文章主要介紹了C語言 數(shù)據(jù)結構之中序二叉樹實例詳解的相關資料,需要的朋友可以參考下
    2017-01-01
  • C語言實現(xiàn)任意進制轉換器

    C語言實現(xiàn)任意進制轉換器

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)任意進制轉換器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Qt5.9實現(xiàn)簡單復合圖形

    Qt5.9實現(xiàn)簡單復合圖形

    這篇文章主要為大家詳細介紹了Qt5.9實現(xiàn)簡單復合圖形,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Visual?C++?6.0添加一個對話框的實現(xiàn)步驟

    Visual?C++?6.0添加一個對話框的實現(xiàn)步驟

    VC6.0是微軟公司推出的一款集成開發(fā)環(huán)境,本文主要介紹了Visual?C++?6.0添加一個對話框的實現(xiàn)步驟,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06

最新評論

新安县| 霸州市| 宣武区| 曲水县| 伊宁市| 海淀区| 安宁市| 巴南区| 和平县| 安仁县| 上栗县| 松江区| 青海省| 沂水县| 玉屏| 宜宾县| 沂源县| 深水埗区| 乐昌市| 新平| 常德市| 神池县| 阿勒泰市| 金堂县| 博野县| 邵武市| 葵青区| 大同县| 郸城县| 张掖市| 游戏| 德清县| 梅州市| 师宗县| 翁牛特旗| 盱眙县| 平阴县| 工布江达县| 清丰县| 辰溪县| 开封县|