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 配置数据库服务…

leetcode:编程基础0到1

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

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

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

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

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

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…

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

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

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

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

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

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

<PLC><汇川><串口485>汇川Eazy521系列PLC与特域水冷机进行485通讯的设置

前言 本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。 PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。 除了PLC为主要内容外,PLC相关元器件如触摸屏(HMI)、交换机等工控产品,如…

【前端界面分享】

实现效果&#xff1a;html源码来自b站up主&#xff1a;【CSSJS】甲方&#xff1a;啊&#xff1f;没叫你做那么超前啊_哔哩哔哩_bilibili 本人仅实现了将html格式改为vue3 html版&#xff1a; 对于前端连入门可能都没摸到&#xff0c;学了半天也就改成vue3了&#xff0c;对于输…

【ARM系列】1 of N SPI

1 of N模式 SPI 概述配置流程 概述 GIC-600AE支持1 of N模式SPI。在此模式下可以将SPI target到多个core&#xff0c;并且GIC-600AE可以选择哪些内核接收SPI。 GIC-600AE只向处于powered up 并且使能中断组的core发送SPI。 GIC-600AE会优先考虑那些被认为是active的核&#xf…

SQL注入基础入门

文章目录 前言SQL注入基本操作SQL注入类型分类数字型字符型搜索型xx型Json型数据类型提交的方式 SQL注入的位置分类报错注入报错注入实战案例 SQL注入语句分类insert注入update注入delete注入 编码Tips&#xff1a;Mysql版本区别information_schema数据库详解 其他注入手段宽字…

面试官:Java线程可以无限创建吗?

1. 面试连环call Java线程可以无限创建吗? Java线程和操作系统线程有什么关联? 操作系统为什么要区分内核态和用户态? ⏩要想解答这些问题&#xff0c;我们要先从操作系统线程开始说起&#xff0c;让我们开始吧&#x1f389;&#x1f389;&#x1f389; 2. 操作系统线程…

为什么要学习Go

本文旨在探讨为什么Go语言值得学习,以及它如何能够提升您的编程技能和职业发展。我们将深入分析Go语言的核心优势,包括其简洁的语法、强大的并发支持、卓越的性能表现,以及在云计算、微服务和系统编程等领域的广泛应用 GO logo的核心理念&#xff0c;即简单胜于复杂。使用现代…

Redis-Redis可视化工具Redis Insight下载及安装

下载 1、博主已经上传资源&#xff0c;点此下载 2、点此进入官方下载 2.1 点击Installing Redis Insight 2.2 点击Install on desktop 2.3 选择Install on desktop&#xff0c;点击Redis Insight is available for download for free from this web site从网站下载 2.4 下载…

Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO

官网&#xff1a;https://streamlit.io/ github&#xff1a;https://github.com/streamlit/streamlit API 参考&#xff1a;https://docs.streamlit.io/library/api-reference 最全 Streamlit 教程&#xff1a;https://juejin.cn/column/7265946243196436520 Streamlit-中文文档…

MYSQL 四、mysql进阶 7(性能分析工具的使用)

一、数据库服务器的优化步骤 数据库调优流程图: 整个流程划分成了 观察&#xff08;Show status&#xff09; 和 行动&#xff08;Action&#xff09; 两个部分。字母 S 的部分代表观察&#xff08;会使 用相应的分析工具&#xff09;&#xff0c;字母 A 代表的部分是行…

算法012:将x减到0的最小操作数

将x减到0的最小操作数. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/minimum-operations-to-reduce-x-to-zero/ 这个题使用到的是滑动窗口。 乍一看&#xff0c…

U盘管理软件有哪些?3款好用的软件亲测有效!

在数字化办公与数据交换日益频繁的今天&#xff0c;U盘作为便携的存储设备&#xff0c;其重要性不言而喻。 然而&#xff0c;U盘的使用也带来了数据泄露、病毒感染等安全隐患。为了有效管理U盘&#xff0c;确保数据安全与合规性&#xff0c;市场上涌现出了众多U盘管理软件。 小…