Qt xml示范

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.mzph.cn/web/3527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试:JVM垃圾回收

一、三种垃圾回收算法 1、标记清除&#xff08;已废弃&#xff09; 找到根对象&#xff08;局部变量正在引用的对象、静态变量正在引用的对象&#xff09;&#xff1b;沿着根对象的引用链&#xff0c;查看当前的对象是否被根对象所引用&#xff0c;若被引用&#xff0c;则加上…

区块链 | OpenSea 相关论文:Toward Achieving Anonymous NFT Trading(一)

​ &#x1f951;原文&#xff1a; Toward Achieving Anonymous NFT Trading &#x1f951;写在前面&#xff1a; 本文对实体的介绍基于论文提出的方案&#xff0c;而非基于 OpenSea 实际采用的方案。 其实右图中的 Alice 也是用了代理的&#xff0c;不过作者没有画出来。 正文…

UEFI安全启动模式下安装Ubuntu的NVIDIA显卡驱动

UEFI安全启动模式下安装ubuntu的nvidia显卡驱动 实践设备&#xff1a;华硕FX-PRO&#xff08;NVIDIA GeForce GTX 960M&#xff09; 一、NVIDIA官网下载驱动 1.1在浏览器地址栏输入https://www.nvidia.cn/drivers/lookup/进入网站&#xff0c;接着手动驱动搜索&#xff0c;并…

The Clock and the Pizza [NeurIPS 2023 oral]

本篇文章发表于NeurIPS 2023 (oral)&#xff0c;作者来自于MIT。 文章链接&#xff1a;https://arxiv.org/abs/2306.17844 一、概述 目前&#xff0c;多模态大语言模型的出现为人工智能带来新一轮发展&#xff0c;相关理论也逐渐从纸面走向现实&#xff0c;影响着人们日常生活…

探讨mfc100u.dll丢失的解决方法,修复mfc100u.dll有效方法解析

mfc100u.dll丢失是一个比较常见的情况&#xff0c;由于你电脑的各种操作&#xff0c;是有可能引起dll文件的缺失的&#xff0c;而mfc100u.dll就是其中的一个重要的dll文件&#xff0c;它的确实严重的话是会导致程序打不开&#xff0c;系统错误的。今天我们就来给大家科普一下mf…

太速科技-多路PCIe的阵列计算全国产化服务器

多路PCIe的阵列计算全国产化服务器 多路PCIe的阵列计算全国产化服务器以国产化处理器&#xff08;海光、飞腾ARM、算能RSIC V&#xff09;为主板&#xff0c;扩展6-8路PCIe3.0X4计算卡&#xff1b; 计算卡为全国产化的AI处理卡&#xff08;瑞星微ARM&#xff0c;算能AI&#x…

【stm32】swjtu西南交大嵌入式实验三 外部中断实验:按键中断

实验内容&#xff1a; 1、编写程序&#xff0c;设置主程序&#xff1a;跑马灯以 0.2s 的速度旋转&#xff1b;将 KB1 设置为外部中断&#xff0c;下 降沿触发&#xff0c;按下 KB1 则全彩灯的 R 灯闪烁 5 次。编译、下载程序到开发板&#xff0c;观察实 验现象&#xff1b;按下…

阶跃星辰:探索智能科技的星辰大海

引言 在当今快速发展的科技时代&#xff0c;人工智能已经成为推动社会进步的重要力量。阶跃星辰&#xff0c;正是在这一背景下诞生的。 阶跃星辰是一家专注于通用人工智能探索的公司&#xff0c;成立于2023年4月。该公司的创始团队由一群对人工智能充满热情和渴望的人组成&am…

LM1875L-TB5-T 音频功率放大器 PDF中文资料_参数_引脚图

LM1875L-TB5-T 规格信息&#xff1a; 商品类型音频功率放大器 音频功率放大器的类型- 输出类型1-Channel (Mono) 作业电压16V ~ 60V 输出功率25W x 1 4Ω 额外特性过流保护,热保护 UTC LM1875是一款单片功率放大器&#xff0c;可为消费类音频应 用提供极低失真和高品质的…

物联网鸿蒙实训解决方案

一、建设背景 在数字化浪潮汹涌的时代&#xff0c;华为鸿蒙系统以其前瞻的技术视野和创新的开发理念&#xff0c;成为了引领行业发展的风向标。 据华为开发者大会2023&#xff08;HDC. Together&#xff09;公布的数据&#xff0c;鸿蒙生态系统展现出了强劲的发展动力&#x…

【论文浅尝】Phi-3-mini:A Highly Capable Language Model Locally on Your Phone

Phi-3-mini phi-3-mini&#xff0c;一个3.8亿个参数的语言模型&#xff0c;训练了3.3万亿个token&#xff0c;其总体性能&#xff0c;通过学术基准和内部测试进行衡量&#xff0c;可以与Mixtral 8x7B和GPT-3.5等模型相媲美(在MMLU上达到69%&#xff0c;在MT-bench上达到8.38)&…

深圳证券交易所Binary行情数据接口规范

对接深圳证券交易所Binary行情数据接口其实并不难&#xff0c;你需要具备以下知识。 1、需要了解Binary报文设计结构&#xff0c;消息头消息体消息尾。 消息体&#xff1a; 如果是纯map结构的比较简单&#xff0c;字段平铺开来即可。如{"id":"1","…

WEB服务的配置与使用 Apache HTTPD

服务端&#xff1a;服务器将发送由状态代码和可选的响应正文组成的 响应 。状态代码指示请求是否成功&#xff0c;如果不成功&#xff0c;则指示存在哪种错误情况。这告诉客户端应该如何处理响应。较为流星的web服务器程序有&#xff1a; Apache HTTP Server 、 Nginx 客户端&a…

bugfix: com.alibaba.druid.sql.parser.EOFParserException: EOF

前言 在日常的开发工作中&#xff0c;我们经常会遇到各种各样的问题&#xff0c;其中涉及数据库操作的接口联调尤其容易出现意想不到的状况。今天我就遇到了一个关于Druid SQL解析异常的问题&#xff0c;具体表现为com.alibaba.druid.sql.parser.EOFParserException: EOF。通过…

基于SpringBoot开发的同城租房系统租房软件APP小程序源码

项目背景 一、市场前景 随着城市化进程的加快和人口流动性的增强&#xff0c;租房市场正逐渐成为一个不可忽视的巨大市场。传统的租房方式往往存在着信息不对称、效率低下等问题&#xff0c;而同城租房软件的出现&#xff0c;则有效地解决了这些问题&#xff0c;为租房市场注…

k8s日常动手实践 ~~ pod访问 pod请求 k8s api ~ 含新版带curl的busybox镜像

前言&#xff1a; 可以使用 Kubernetes API 获取集群信息。使用 Service Account&#xff08;SA&#xff09;进行身份验证&#xff0c;可以以安全的方式访问 Kubernetes API&#xff0c;而无需在 Pod 中使用明文凭据。 以下是一个使用 Service Account 访问 Kubernetes API 获…

每日OJ题_DFS回溯剪枝①_力扣46. 全排列(回溯算法简介)

目录 回溯算法简介 力扣46. 全排列 解析代码 回溯算法简介 回溯算法是一种经典的递归算法&#xff0c;通常⽤于解决组合问题、排列问题和搜索问题等。 回溯算法的基本思想&#xff1a;从一个初始状态开始&#xff0c;按照⼀定的规则向前搜索&#xff0c;当搜索到某个状态无…

【韩国】UE5的MetaHuman确实可以导入Blender进行编辑。

UE5的MetaHuman确实可以导入Blender进行编辑。根据网络上的信息&#xff0c;你可以将MetaHuman模型导出为FBX文件&#xff0c;然后在Blender中进行修改。修改完成后&#xff0c;你可以将其重新导入到Unreal Engine 5中4。请注意&#xff0c;当你在Blender中编辑模型时&#xff…

虚拟线程的定义及使用

0.前言 长期以来&#xff0c;虚拟线程是 Java 中最重要的创新之一。 它们是在 Project Loom 中开发的&#xff0c;自 Java 19 作为预览功能以来一直包含在 JDK 中&#xff0c;自 Java 21 作为最终版本 (JEP 444) 以来&#xff0c;它们已包含在 JDK 中。 1.虚拟线程的作用 任…

Docker——开源的应用容器的引擎

目录 一、前言 1.虚拟化产品有哪些 1.1寄居架构 1.2源生架构 2.虚拟化产品对比/介绍 2.1虚拟化产品 2.1.1仿真虚拟化 2.1.2半虚拟化 2.1.3全虚拟化 2.2重点 2.2.1KVM——Linux内核来完成的功能和性能 2.2.2ESXI——用的比较多 二、Docker概述 1.Docker定义 2.Do…