Qt xml示范

2024-04-26 06:52
文章标签 xml qt 示范

本文主要是介绍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.效果图

这篇关于Qt xml示范的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/936885

相关文章

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Python xmltodict实现简化XML数据处理

《Pythonxmltodict实现简化XML数据处理》Python社区为提供了xmltodict库,它专为简化XML与Python数据结构的转换而设计,本文主要来为大家介绍一下如何使用xmltod... 目录一、引言二、XMLtodict介绍设计理念适用场景三、功能参数与属性1、parse函数2、unpa

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节

Qt实现文件的压缩和解压缩操作

《Qt实现文件的压缩和解压缩操作》这篇文章主要为大家详细介绍了如何使用Qt库中的QZipReader和QZipWriter实现文件的压缩和解压缩功能,文中的示例代码简洁易懂,需要的可以参考一下... 目录一、实现方式二、具体步骤1、在.pro文件中添加模块gui-private2、通过QObject方式创建