Qt xml示范

news/2024/5/19 17:30:25

1.数据格式

#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;// 创建根节点QDomElement root = doc.createElement("Student");doc.appendChild(root);// 创建子节点并设置属性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节点xmlWriter.writeEndDocument();file.close();
}void Xml_Example1::saveXml_tinyxml2(const Student &stu, const QString &filePath)
{// 创建一个 XML 文档对象tinyxml2::XMLDocument doc;// 创建根节点tinyxml2::XMLElement* root = doc.NewElement("Student");doc.InsertEndChild(root);// 添加学生信息作为子节点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)
{// 创建 QDomDocument 对象QDomDocument doc;// 创建根元素 <Teacher>QDomElement root = doc.createElement("Teacher");doc.appendChild(root);// 创建子元素 <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);// 创建子元素 <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); // 缩进格式为4file.close();}void Xml_Example1::saveXml_writer(const Teacher &tea, const QString &filePath)
{// 创建文件对象QFile file(filePath);if (!file.open(QIODevice::WriteOnly | QIODevice::Text)){qDebug() << "无法打开文件" << filePath;return;}// 创建 XML 写入器QXmlStreamWriter xmlWriter(&file);xmlWriter.setAutoFormatting(true); // 设置自动格式化,便于阅读// 开始写入 XMLxmlWriter.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>节点}// 结束写入 XMLxmlWriter.writeEndElement(); // 关闭<Teacher>节点xmlWriter.writeEndDocument();// 关闭文件file.close();
}void Xml_Example1::saveXml_tinyxml2(const Teacher &tea, const QString &filePath)
{// 创建一个 XML 文档对象tinyxml2::XMLDocument doc;// 创建根节点tinyxml2::XMLElement *root = doc.NewElement("Teacher");doc.InsertEndChild(root);// 添加教师信息作为子节点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);// 添加学生信息作为子节点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)
{// 创建一个 XML 文档对象tinyxml2::XMLDocument doc;// 加载 XML 文件if(doc.LoadFile(filePath.toStdString().c_str()) != tinyxml2::XML_SUCCESS) {qDebug() << "Error loading XML file.";return;}// 获取根节点tinyxml2::XMLElement* root = doc.FirstChildElement("Student");if(!root) {qDebug() << "Root element 'Student' not found.";return;}// 解析子节点并填充到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)
{// 创建一个 XML 文档对象tinyxml2::XMLDocument doc;// 加载 XML 文件if(doc.LoadFile(filePath.toStdString().c_str()) != tinyxml2::XML_SUCCESS) {qDebug() << "Error loading XML file.";return;}// 获取根节点tinyxml2::XMLElement* root = doc.FirstChildElement("Teacher");if(!root) {qDebug() << "Root element 'Teacher' not found.";return;}// 解析子节点并填充到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, 和 EnglishScorestudent->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类已经定义,且有适当的方法来存储这些信息}// 获取学生节点// tinyxml2::XMLElement* studentElement = root->FirstChildElement("Students");// if(!studentElement) {//     qDebug() << "Element 'Students' not found.";//     return;// }// tinyxml2::XMLNode* studetsNode=root->// 解析学生节点// 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.效果图


http://www.mrgr.cn/p/17021243

相关文章

Day01 Web服务搭建站库分离路由访问

常规的Web应用搭建: 1.购买云服务器,购买域名2.云服务器去搭建中间件 windows server 安装web角色后默认可以直接通过域名打开网站首页3.下载并上传Web程序源码 zblog源码官网可下载4.添加网站并绑定域名目录 域名解析设置:二级域名ablog.whgojp.top 解析到该服务器zblog程序…

网络安全防护措施:保障信息安全的关键

随着互联网的普及和信息技术的快速发展&#xff0c;网络安全已成为企业和个人必须重视的重要问题。网络安全不仅涉及到保护个人隐私和机密信息&#xff0c;还关系到企业的声誉和财务安全。在这个信息爆炸的时代&#xff0c;制定有效的网络安全防护措施至关重要。本文将探讨几种…

什么是langchain

概念 LangChain 是一个用于开发由语言模型驱动的应用程序的框架。他主要拥有 2 个能力&#xff1a; -可以将 LLM 模型&#xff08;大规模语言模型&#xff09;与外部数据源进行连接 -允许与 LLM 模型进行交互基础功能 支持多种模型接口&#xff0c;比如 OpenAI、Hugging Fac…

c++使用googletest进行单元测试

googletest进行单元测试 使用Google test进行测试一、单元测试二、使用gmock测试 使用Google test进行测试 使用场景&#xff1a; 在平时写代码中&#xff0c;我们需要测试某个函数是否正确时可以使用Google test使用&#xff0c;当然&#xff0c;我们也可以自己写函数进行验证…

什么是储能电站的一次设备与二次设备?

随着国家政策导向和扶持&#xff0c;储能电站的建设&#xff0c;在各地均稳步推进&#xff0c;储能电站的设备主要分一次设备和二次设备两种&#xff0c;下面分别介绍这两方面内容&#xff1a; 储能电站一次设备 一次设备是储能电站的电路基础设施&#xff0c;包含变压器、主…

基于Python实现的推箱子小游戏

Python贪吃蛇小游戏实现: 推箱子曾经在我们的童年给我们带来了很多乐趣。推箱子这款游戏现在基本上没人玩了&#xff0c;甚至在新一代人的印象中都已毫无记忆了。。。但是&#xff0c;这款游戏可以在一定程度上锻炼自己的编程能力。 运行效果如图所示&#xff1a; 游戏关卡有点…

就业班 第三阶段(nginx) 2401--4.22 day1 nginx1 http+nginx初识+配置+虚拟主机

一、HTTP 介绍 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 HTTP是一个基于TCP/IP通信协议来传递数据&#xff08;HTML 文件…

前端开发攻略---用原生JS在网页中也能实现文本转语音

1、原理 语音合成 (也被称作是文本转为语音&#xff0c;英语简写是 tts) 包括接收 app 中需要语音合成的文本&#xff0c;再在设备麦克风播放出来这两个过程。 Web API中对此有一个主要控制接口 SpeechSynthesis&#xff0c;外加一些处理如何表示要被合成的文本 (也被称为 utte…

curl wget 下载文件

curl 下载文件:curl -kO https://10.0.8.5:8888/chfs/shared/Application/360se13.1.6055.0.exe #下载远程服务器上的文件,需要定位到末端文件-k #忽略服务器ssl证书 -O #保存文件至本地,并使用源文件名 -o zhang.exe #使用自定义文件名 zhang.exe…

网络安全数字孪生:一种新颖的汽车软件解决方案

摘要 随着汽车行业转变为数据驱动的业务&#xff0c;软件在车辆的开发和维护中发挥了核心作用。随着软件数量的增加&#xff0c;相应的网络安全风险、责任和监管也随之增加&#xff0c;传统方法变得不再适用于这类任务。相应的结果是整车厂和供应商都在努力应对汽车软件日益增加…

CarrierConfig 加载流程和配置覆盖问题

问题 有的MVNO卡没有配置过 CarrierConfig及相关 overlay,但是实际运行的时候功能被override了 ,此时可能是因为CarrierConfig用了父类(同MCCMNC等情况)的配置,因此在直接查找对应卡cid或mccmnc+mvno属性时候的CarrierConfig是没办法找到影响功能的配置项的。 代码逻辑 …

力扣-LCR 126. 斐波那契数

1.题目 题目地址(LCR 126. 斐波那契数 - 力扣(LeetCode)) https://leetcode.cn/problems/fei-bo-na-qi-shu-lie-lcof/ 题目描述 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) …

qml 下拉框图片的代码,不是ComBox

// 导入 QtQuick 2.2 模块 import QtQuick 2.2// 定义一个 Rectangle 组件&#xff0c;作为下拉菜单的容器 Rectangle {id: dropdown // 下拉菜单的 IDx: 0 // x 坐标y: 0 // y 坐标z: 0 // z 坐标width: 458 // 宽度height: 60 // 高度radius: 8 // 圆角半径color: "tran…

力扣HOT100 - 200. 岛屿数量

解题思路&#xff1a; 岛屿题目一般使用dfs。 1.判断是否越界 2.用0&#xff0c;1&#xff0c;2三个状态标识当前格子的状态&#xff08;三个状态比两个状态更清晰&#xff09; 3.向周围四个方向遍历 class Solution {public int numIslands(char[][] grid) {int cnt 0;fo…

R语言银行信用数据SOM神经网络聚类实现可视化

原文链接:http://tecdat.cn/?p=3231 原文出处:拓端数据部落公众号当今社会,“信用”越来越多的人们关注个人或企业,有望获得最高的信用评分,以享受更多的信贷额度,更优惠的利率。 那么我们如何评分信用,并使我们的客户可视化? 自组织地图( SOM )是一种无监督的数据可…

2024年大数据应用、智能控制与软件工程国际会议(BDAICSE2024)

2024年大数据应用、智能控制与软件工程国际会议(BDAICSE2024) 会议简介 我们诚挚邀请您参加2024年大数据应用、智能控制和软件工程国际会议&#xff08;BDAICSE2024&#xff09;。这次会议将在美丽的长沙市举行。 本次大会旨在汇聚全球大数据应用、智能控制、软件工程等领…

PostgreSql-Install

PostgreSql源码安装 一、源代码下载二、操作系统配置三、编译安装四、启动数据库五、相关命令 PostgreSQL是一个强大的 开源对象关系数据库系统&#xff0c;它使用并扩展了SQL语言&#xff0c;并结合了许多功能&#xff0c;可以安全地存储和扩展最复杂的数据工作负载。 一、源…

第四章:Total Store Order and the x86 Memory Model

chapter4:TSO于X86内存模型 1、为什么需要TSO/x86 处理器内核长期以来使用write buffer来保存已提交的store指令,直到内存系统可以处理这些store请求。当store指令提交时,store请求进入write buffer,而当需要写入的缓存行在内存系统中可以保证缓存一致性时,store请求就退出…

1-内核开发环境ubuntu+virtualbox+mobaXterm搭建

内核开发环境 ubuntuvirtualboxmobaXterm搭建 目录 内核开发环境 ubuntuvirtualboxmobaXterm搭建 1.virtualbox 安装 2.ubuntu 安装 3.网络设置 4.虚拟机安装ssh 服务&#xff0c;更新ubuntu 源安装基本软件 5.mobaXterm 个人免费版本安装 6.总结 本课程教程从0-1开始教…