Qt json和xml操作

 

学习目标: 认识json和xml读写操作

前置环境

运行环境:qt creator 4.12

学习内容

XML

XML(Extensible Markup Language)是一种标记语言,是一种用于描述数据结构的语言。它非常适合用于存储和传输数据。

XML 的主要特点如下:

  1. 可扩展性:XML 允许用户定义自己的标签,这使得 XML 非常灵活和可扩展。

  2. 可读性强:XML 文档结构清晰,可读性强,更容易被人们理解。

  3. 平台独立性:XML 是基于文本的,独立于软硬件平台,因此可以在不同的系统和设备上进行交互。

  4. 自我描述性:XML 文档包含了对数据的描述,使得数据更容易理解和处理。

  5. 数据交换:XML 广泛应用于数据交换,尤其是在不同应用程序或系统之间进行数据传输时。

以下是一些具体的使用场景示例:

  1. XML 网页:

    • 使用 XML 构建可扩展的网站内容管理系统。
    • 利用 XML 技术实现高度个性化和动态的网页展示。
  2. 数据交换:

    • 在企业 ERP 系统之间交换客户、订单、库存等数据。
    • 在社交网络平台之间共享用户个人信息和内容数据。
  3. Web 服务:

    • 在移动应用和后端服务器之间使用 SOAP 协议进行数据同步。
    • 为第三方开发者提供基于 REST 的 XML 格式的 Web API。

 以下是一个简单的XML示例:

<?xml version="1.0" encoding="UTF-8"?>
<person><name>小吕布</name><age>30</age><city>上海</city><hobbies><hobby>读书</hobby><hobby>游泳</hobby></hobbies>
</person>

JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它是基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。

JSON的特点如下:

  1. 简单明了:JSON采用完全独立于语言的文本格式,非常容易理解和编写。

  2. 易于解析:数据格式简单,很容易被机器解析和生成,相比XML更加简洁高效。

  3. 广泛应用:JSON被广泛应用于现代Web应用程序的数据传输,特别是在AJAX技术中,JSON已经成为主要的数据格式。

  4. 易于阅读:JSON的读写非常简单。

  5. 支持多种数据类型:包括对象、数组、数字、字符串、布尔值和null。

以下是一个简单的JSON示例:

{"name": "John Doe","age": 30,"city": "New York","hobbies": ["reading", "swimming", "traveling"]
}

 项目实现

效果演示

分别是xml和json的效果

Qt中使用xml和json读写

xml代码

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);setGeometry(200,200,700,400);}Dialog::~Dialog()
{delete ui;
}void Dialog::on_pushButton_clicked() //写
{QDomDocument domd;//头部处理命令QDomProcessingInstruction version=domd.createProcessingInstruction("xml","version = \"1.0\" encoding = \"GB2312\"");domd.appendChild(version);//顶层节点QDomElement item =domd.createElement("factory");domd.appendChild(item);//二级节点QDomElement item2=domd.createElement("workers");item.appendChild(item2);{QDomElement item31 =domd.createElement("wid");  //节点QDomText domtext31 =domd.createTextNode("wwid");    //内容domtext31.setData(ui->lineEdit->text());item31.appendChild(domtext31);item2.appendChild(item31);QDomElement item32 =domd.createElement("wname");  //节点QDomText domtext32 =domd.createTextNode("wwname");    //内容domtext32.setData(ui->lineEdit_2->text());item32.appendChild(domtext32);item2.appendChild(item32);QDomElement item33 =domd.createElement("wsex");  //节点QDomText domtext33 =domd.createTextNode("");    //内容domtext33.setData(ui->lineEdit_3->text());item33.appendChild(domtext33);item2.appendChild(item33);QDomElement item34 =domd.createElement("wage");QDomText domtext34 =domd.createTextNode("");    //内容domtext34.setData(ui->lineEdit_5->text());item34.appendChild(domtext34);item2.appendChild(item34);QDomElement item35 =domd.createElement("department");QDomText domtext35 =domd.createTextNode("");    //内容domtext35.setData(ui->lineEdit_4->text());item35.appendChild(domtext35);item2.appendChild(item35);QDomElement item36 =domd.createElement("wmoney");QDomText domtext36 =domd.createTextNode("");    //内容domtext36.setData(ui->lineEdit_6->text());item36.appendChild(domtext36);item2.appendChild(item36);}QFile f("./work.xml");if(f.open(QIODevice::WriteOnly | QIODevice::Text)){f.write(domd.toString().toLocal8Bit().data());f.close();QMessageBox::information(this,"写入成功","写入xml文件成功");}}void Dialog::on_pushButton_2_clicked()//读
{QDomDocument dodm;//取内容QFile f("./work.xml");if(f.open(QIODevice::ReadOnly )){if(!dodm.setContent(&f)){f.close();return;}f.close();}// 处理 XML 文档 读取顶层QDomElement root = dodm.documentElement();// 读取第一个二级节点QDomNode item = root.firstChild();while(!item.isNull()){QDomNodeList item2=item.childNodes();QString item2name =item.toElement().tagName();if(item2name =="workers"){//处理二级节点  为workers的数据for (int i=0;i< item2.size();i++) {//获取当前二级的子类 三级节点QDomElement item3 = item2.at(i).toElement();// 取出子节点进行比较{if(item3.toElement().tagName().compare("wid")==0){ui->lineEdit_13->setText(item3.text());}else if(item3.toElement().tagName().compare("wname")==0){ui->lineEdit_14->setText(item3.text());}else if(item3.toElement().tagName().compare("wsex")==0){ui->lineEdit_15->setText(item3.text());}else if(item3.toElement().tagName().compare("wage")==0){ui->lineEdit_16->setText(item3.text());}else if(item3.toElement().tagName().compare("department")==0){ui->lineEdit_17->setText(item3.text());}else if(item3.toElement().tagName().compare("wmoney")==0){ui->lineEdit_18->setText(item3.text());}}}}item=item.nextSibling(); // 读取下一个二级}
}

json代码

#include "dialog.h"
#include "ui_dialog.h"Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);setGeometry(200,200,400,200);
}Dialog::~Dialog()
{delete ui;
}void Dialog::on_writeJson_clicked() //写入思路:先创建写入数据obj, 再使用Document合并 使用doc对象返回数据
{QJsonObject mysql;mysql.insert("ip","127.0.0.1");mysql.insert("port",121);mysql.insert("user","root");mysql.insert("pwd","111111");QJsonObject app;app.insert("version","v1.0");app.insert("mysql",mysql);QJsonDocument  doc;doc.setObject(app);QFile file("./app.json");if(file.open(QIODevice::WriteOnly)){file.write(doc.toJson());file.close();QMessageBox::information(this,"成功","json写入成功");}}void Dialog::on_readJson_clicked()//思路:先把文件内容全部读出,再通过中间层doc 取出字符
{QFile f("./app.json");if(!f.open(QIODevice::ReadOnly | QIODevice::Text)){QMessageBox::critical(this,"失败","配置文件未找到");exit(100);}//读文件QTextStream in(&f);QString sjson =in.readAll();f.close();// 解析 JSON 数据QJsonParseError jsonerror; // 返回JSON解析错误的时候,报告详细错误信息QJsonDocument doc = QJsonDocument::fromJson(sjson.toUtf8(),&jsonerror);if(doc.isEmpty() && (jsonerror.error != QJsonParseError::NoError)){QMessageBox::critical(this,"失败","配置文件 JSON 格式有误");exit(100);}//解析思路:取出obj 然后再取值再tostringQString result;QJsonObject obj = doc.object();QJsonValue ver = obj.value("version");result+=ver.toString();QJsonValue mysql = obj.value("mysql");if(ver.isUndefined() || !ver.isString() || mysql.isUndefined() || !mysql.isObject()){qDebug()<<"转换JSON数据错误,请重新检查?";QMessageBox::critical(this,"错误","转换JSON数据错误,请重新检查?");exit(100);}QJsonObject mysqlinfo =mysql.toObject(); //可再次检查result+=mysqlinfo.value("ip").toString();result+=mysqlinfo.value("port").toString();result+=mysqlinfo.value("user").toString();result+=mysqlinfo.value("pwd").toString();qDebug()<<result;QMessageBox::information(this,"成功","转换JSON数据:"+result);}

总结

xml在qt中使用重要概念:

QDomDocument  文档
    createElement   创建节点操作 
QDomElement    节点    多级节点
    firstChild();第一个子节点
    childNodes 全部子节点
    appendChild添加子节点

json在qt中使用的重要概念:

文件doc  k值 qjsonobj  v值qjsonvalue 

比如mysql是qjsonobj值   v值是value,虽然v是qjsonvalue类型,但由于数据是obj则可进行toobj再次取值。

 最后附上源代码链接
对您有帮助的话,帮忙点个star

30-Qjson · jbjnb/Qt demo - 码云 - 开源中国 (gitee.com)

31-Qxml · jbjnb/Qt demo - 码云 - 开源中国 (gitee.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/42986.shtml

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

相关文章

数组算法(二):交替子数组计数

1. 官方描述 给你一个二进制数组nums 。如果一个子数组中 不存在 两个 相邻 元素的值 相同 的情况&#xff0c;我们称这样的子数组为 交替子数组 。 返回数组 nums 中交替子数组的数量。 示例 1&#xff1a; 输入&#xff1a; nums [0,1,1,1] 输出&#xff1a; 5 解释&#…

项目一单机安装基于LNMP结构的WordPress网站 web与数据库服务分离

网站的类型&#xff1a; Jave:LNMT PHP:LNMP Python: LNMU 项目部署&#xff1a; 1.项目的类型&#xff08;项目的开发语言&#xff09; 2.项目运营平台的技术选择 3.尽快让项目运行起来 all in one部署 4. 架构的优化 配置ansible管理环境 配置nginx 配置数据库服务…

ubuntu系统如何查看进程使用网络带宽的情况

在Ubuntu系统中&#xff0c;你可以使用几种方法来查看哪些进程正在使用上传&#xff08;上传流量&#xff09;资源。这里有几个常用的方法&#xff1a; 1. 使用iftop iftop 是一个实时监控网络带宽使用情况的工具&#xff0c;它可以显示哪些连接正在使用上传和下载带宽。但请…

leetcode:编程基础0到1

文章目录 交替合并字符串str.length();StringBuilder类型 ,toString()append() &#xff0c;chatAt()题目描述 交替合并字符串 str.length(); 输出字符串str的长度 StringBuilder类型 ,toString() append() &#xff0c;chatAt() 题目描述 class Solution {public String …

Linux tputs

tputs(char *const str, int affcnt, int (*putfunc)(int)) 设置终端输出显示参数 tputs(tmp, 1, putchar) 49c1: 48 8d 3d 44 17 00 00 lea 0x1744(%rip),%rdi # 610c <_IO_stdin_usedBase0x10c> 49c8: 31 f6 xor %esi…

华为的MDE岗位的全称是“Module Design Engineer“,即模块设计师

华为的MDE岗位的全称是"Module Design Engineer"&#xff0c;即模块设计师。以下是MDE岗位的主要角色认知和职责&#xff1a; ### 角色认知&#xff1a; 1. **系统设计的传承人和模块设计的责任者**&#xff1a;MDE负责参与系统设计&#xff0c;传承系统设计理念&am…

python获取文件列表按照文件修改时间进行排序,默认按照文件名时间戳排序

python获取文件列表按照文件修改时间进行排序,默认按照文件名时间戳排序 1、流程 1、获取文件绝对路径下的所有文件 2、通过os.path.getmtime获取每个文件的修改时间,并与文件组成元组,方便后续排序 3、默认按照时间戳降序,否则按照按修改时间排序文件列表(从最晚到最早)…

开个技术外挂|用技术轻松实现GPU显卡冷却风扇噪声控制

GPU显卡冷却风扇噪声分析 游戏玩家可能有这样的体验&#xff1a;当显卡卖力工作的时候&#xff0c;明显感觉到从机箱传来的噪声变大了。这是因为系统监测到芯片有过热风险&#xff0c;从而自动提升了冷却风扇的转速。 如下图所示&#xff0c;当GPU显卡处于 20C 时&#xff0c;风…

如何在Perl中进行条件判断:掌握Perl条件语句的艺术

如何在Perl中进行条件判断&#xff1a;掌握Perl条件语句的艺术 Perl是一种功能强大的脚本语言&#xff0c;它在文本处理和系统管理任务中尤为出色。在Perl编程中&#xff0c;条件判断是控制程序流程的重要手段。本文将详细探讨如何在Perl中使用条件判断语句&#xff0c;包括if…

Markdown介绍

Markdown是一种轻量级标记语言&#xff0c;旨在使用纯文本格式进行内容编写&#xff0c;并最终转化为格式化的文档。由约翰格鲁伯&#xff08;John Gruber&#xff09;和亚伦斯沃茨&#xff08;Aaron Swartz&#xff09;在2004年创建&#xff0c;Markdown非常适合撰写文档、笔记…

WIN32核心编程 - 文件系统 - 文件搜索和遍历 - 目录操作 - 路径解析

公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 文件搜索和遍历 搜索文件和目录 递归遍历目录 定位指定文件 示例代码 目录操作 绝对路径和相对路径 文件搜索和遍历 搜索文件和目录 在Windows中&#xff0c;您可以使用FindFirstFile和…

212.贪心算法:跳跃游戏(力扣)

代码解决 class Solution { public:bool canJump(vector<int>& nums) {int cover 0; // 初始化覆盖范围if (nums.size() 1) return true; // 如果数组长度为1&#xff0c;直接返回 true// 遍历数组&#xff0c;直到当前覆盖范围for (int i 0; i < cover; i…

未来已来:为TARS机器人搭载文心一言AI大模型的完整开发流程

集成百度文心一言&#xff08;Ernie Bot&#xff09;的步骤类似于集成ChatGPT。下面是集成文心一言的大模型的详细开发思路&#xff1a; 1. 确定项目需求和目标 明确项目需求和目标&#xff0c;包括&#xff1a; 机器人需要具备的功能需要处理的主要任务和场景用户群体系统性…

【易捷海购-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

java —— Servlet 技术

Servlet 是在 java 中嵌套 html 的一项技术&#xff0c;这点与 JSP 刚好相反&#xff0c;JSP 是在 html 中嵌套 java 的一项技术。 一、Servlet &#xff08;一&#xff09;前言 1、Servlet 事实上也是一个类&#xff0c;其添加方式与类的添加方式一样&#xff1b; 2、Serv…

数据库文件,根据表中的具体列名称查询

此查询以列属性为整型为依据&#xff0c;也可根据字符串类型进行相应的函数接口修改 #include <stdio.h> #include <sqlite3.h>int main() {sqlite3 *db;int rc;const char *db_path "test.db"; // 数据库文件路径// 打开数据库rc sqlite3_open(db_pa…

【活动行】参与上海两场线下活动,教育生态行业赛总决赛活动和WAIC人工智能大会活动 - 上海活动总结

目录 背景决赛最后一公里领域范围 决赛作品AI智教相机辅导老师Copilot辅导老师Copilot雅思写作竞技场 优秀作品总结 背景 决赛 百度发起的千帆杯教育生态行业赛于2024年7月4日进行线下决赛&#xff0c;博主虽然没能进入决赛&#xff0c;但也非常荣幸能够以嘉宾身份到现场给进…

Rust: 关于Pin以及move前后分析

一、Pin由来 在Rust中&#xff0c;自引用结构会导致&#xff0c;此变量被move后&#xff0c;其内部自引用的指针指向不改变&#xff0c;从而存在安全隐患 。 注意&#xff1a;Pin是一个struct。UnPin和!UnPin是trait。这个要分清。 二、方案 对自引用结构&#xff0c;如何增…

【VUE基础】VUE3第四节—核心语法之computed、watch、watcheffect

computed 接受一个 getter 函数&#xff0c;返回一个只读的响应式 ref 对象。该 ref 通过 .value 暴露 getter 函数的返回值。它也可以接受一个带有 get 和 set 函数的对象来创建一个可写的 ref 对象。 创建一个只读的计算属性 ref&#xff1a; <template><div cl…

C语言 输出10行杨辉三角形

输出以下的杨辉三角形(要求输出10行)。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 … #include <stdio.h>int main() {int triangle[10][10] {0};for (int i 0; i < 10; i) {triangle[i][0] 1;triangle[i][i] 1;for (int j 1; j < i…