当前位置: 首页 > news >正文

Qt 中操作xml文件和JSON字符串

文章目录

  • 1、概述
    • 1.1、xml介绍
    • 1.2、json介绍
  • 2、xml文件增删改查
    • 2.1、写xml文件内容
    • 2.2、读xml文件内容
    • 2.3、删除xml文件内容
    • 2.4、修改xml文件内容
  • 3、构建JSON字符串
    • 3.1、JSON字符串排版
    • 4、剪切板操作

1、概述

1.1、xml介绍

XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 的设计宗旨是传输数据,而非显示数据
XML 标签没有被预定义。您需要自行定义标签。
XML 被设计为具有自我描述性。
XML 是 W3C 的推荐标准

1.2、json介绍

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。

2、xml文件增删改查

2.1、写xml文件内容

构建这样一个xml结构代码如下:
在这里插入图片描述
如果文件有内容,则添加一项topic,如果文件内容为空,则构建xml文件,添加头文件
QT += xml
#include “QDomNodeList”
#include “QDomNode”

void frmMain::write_xml(QString topic_name,int qos,QColor color)
{// 打开 XML 文件QFile file("../uidemo08/form/topic.xml");if (!file.open(QIODevice::ReadWrite | QIODevice::Text)){return;}// 读取 XML 文档QDomDocument doc;if (!doc.setContent(&file)){// 文件为空,创建新的 XML 文档QDomProcessingInstruction instr = doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");doc.appendChild(instr);QDomElement topics = doc.createElement("topics");doc.appendChild(topics);}// 写入新的 topicQDomElement root = doc.documentElement();QDomElement topic = doc.createElement("topic");QDomElement name = doc.createElement("name");QDomText nameText = doc.createTextNode(topic_name);name.appendChild(nameText);topic.appendChild(name);QDomElement qoss = doc.createElement("qos");QDomText qosText = doc.createTextNode(QString::number(qos));qoss.appendChild(qosText);topic.appendChild(qoss);QDomElement color_red = doc.createElement("color_red");QDomText redText = doc.createTextNode(QString::number(color.red()));color_red.appendChild(redText);topic.appendChild(color_red);QDomElement color_green = doc.createElement("color_green");QDomText greenText = doc.createTextNode(QString::number(color.green()));color_green.appendChild(greenText);topic.appendChild(color_green);QDomElement color_blue = doc.createElement("color_blue");QDomText blueText = doc.createTextNode(QString::number(color.blue()));color_blue.appendChild(blueText);topic.appendChild(color_blue);root.appendChild(topic);// 写入 XML 文件file.resize(0);QTextStream out(&file);doc.save(out, 4);file.close();
}

2.2、读xml文件内容

void frmMain::init_xml()
{QFile inputFile("../uidemo08/form/topic.xml");if(!(inputFile.open(QIODevice::ReadOnly | QIODevice::Text)) ){qDebug()<<"file not exit";return;}QDomDocument doc;if(!doc.setContent(&inputFile)){qDebug()<<"doc failed";inputFile.close();return;}inputFile.close();QDomElement root = doc.documentElement();QDomNodeList topics = root.elementsByTagName("topic");for(int i = 0;i<topics.count();i++){QDomNode node = topics.at(i);if (node.isElement()){QDomElement element = node.toElement();QString name = element.elementsByTagName("name").at(0).toElement().text();int qos = element.elementsByTagName("qos").at(0).toElement().text().toInt();int red = element.elementsByTagName("color_red").at(0).toElement().text().toInt();int green = element.elementsByTagName("color_green").at(0).toElement().text().toInt();int blue = element.elementsByTagName("color_blue").at(0).toElement().text().toInt();topic_itme *item = new topic_itme;item->topic_name = name;item->qos = qos;QColor c(red,green,blue);item->topic_color = c;m_topicItem.push_back(item);}}}

2.3、删除xml文件内容

根基topic名字进行查找,找到对应的结构进行删除

void frmMain::remove_xml(QString topic_name)
{// 打开 XML 文件QFile file("../uidemo08/form/topic.xml");if (!file.open(QIODevice::ReadWrite | QIODevice::Text)){return;}// 读取 XML 文档QDomDocument doc;if (!doc.setContent(&file)){file.close();return;}// 查找要修改的 topicQDomNodeList topics = doc.elementsByTagName("topic");for (int i = 0; i < topics.count(); i++){QDomElement topic = topics.at(i).toElement();if (topic.firstChildElement("name").text() == topic_name){// 删除该 topic 元素QDomNode parent = topic.parentNode();parent.removeChild(topic);// 写入 XML 文件file.resize(0);QTextStream out(&file);doc.save(out, 4);file.close();return;}}// 没有找到要修改的 topicfile.close();return;
}

2.4、修改xml文件内容

根据topic名字进行查找,找到之后进行修改

void frmMain::modity_xml(QString topic_name, QString topic_name_bak, int qos, QColor color)
{// 打开 XML 文件QFile file("../uidemo08/form/topic.xml");if (!file.open(QIODevice::ReadWrite | QIODevice::Text)){return;}// 读取 XML 文档QDomDocument doc;if (!doc.setContent(&file)){file.close();return;}// 查找要修改的 topicQDomNodeList topics = doc.elementsByTagName("topic");for (int i = 0; i < topics.count(); i++){QDomElement topic = topics.at(i).toElement();if (topic.firstChildElement("name").text() == topic_name){QDomElement name_red = topic.firstChildElement("name");QDomText name_Text = doc.createTextNode(topic_name_bak);name_red.replaceChild(name_Text, name_red.firstChild());QDomElement qos_red = topic.firstChildElement("qos");QDomText qos_Text = doc.createTextNode(QString::number(qos));qos_red.replaceChild(qos_Text, qos_red.firstChild());QDomElement color_red = topic.firstChildElement("color_red");QDomText redText = doc.createTextNode(QString::number(color.red()));color_red.replaceChild(redText, color_red.firstChild());QDomElement color_green = topic.firstChildElement("color_green");QDomText greenText = doc.createTextNode(QString::number(color.green()));color_green.replaceChild(greenText, color_green.firstChild());QDomElement color_blue = topic.firstChildElement("color_blue");QDomText blueText = doc.createTextNode(QString::number(color.blue()));color_blue.replaceChild(blueText, color_blue.firstChild());// 写入 XML 文件file.resize(0);QTextStream out(&file);doc.save(out, 4);file.close();return;}}// 没有找到要修改的 topicfile.close();return;
}

3、构建JSON字符串

添加一下头文件
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonValue>
#include <QJsonParseError>
#include <QClipboard>

构建一个json字符串
在这里插入图片描述

 QJsonObject result;result["result"] = "0";result["device_ID"] = deveid;result["aeb_on_off"] = flag;QJsonObject message;message["result"] = result;message["msgname"] = "aeb_on_off_conf";QJsonDocument doc(message);qDebug() << doc.toJson();return QString(doc.toJson());

3.1、JSON字符串排版

主要是整理json字符串让其可读性更高

QString msg = "json字符串内容";
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson(msg.toUtf8(), &error);
// 排版失败
if (doc.isNull()) {return;
}
QByteArray formattedJson = doc.toJson(QJsonDocument::Indented);
// 返回排版成功后的json字符串
QString json_data = QString::fromUtf8(formattedJson);

4、剪切板操作

将QString中的内容推到剪切板中

#include <QClipboard>
QString msg = "内容";
QClipboard* clipboard = QApplication::clipboard();
clipboard->setText(msg);// 检查剪贴板中的文本是否与添加的文本相同
QString clipboardText = clipboard->text();
if (clipboardText == msg) {qDebug() << "Text added to clipboard: " << msg;
} else {qDebug() << "Failed to add text to clipboard: " << msg;
}

相关文章:

Qt 中操作xml文件和JSON字符串

文章目录 1、概述1.1、xml介绍1.2、json介绍 2、xml文件增删改查2.1、写xml文件内容2.2、读xml文件内容2.3、删除xml文件内容2.4、修改xml文件内容 3、构建JSON字符串3.1、JSON字符串排版4、剪切板操作 1、概述 1.1、xml介绍 XML 指可扩展标记语言&#xff08;EXtensible Mark…...

React 基础篇(二)

&#x1f4bb; React 基础篇&#xff08;二&#xff09;&#x1f3e0;专栏&#xff1a;React &#x1f440;个人主页&#xff1a;繁星学编程&#x1f341; &#x1f9d1;个人简介&#xff1a;一个不断提高自我的平凡人&#x1f680; &#x1f50a;分享方向&#xff1a;目前主攻…...

springboot + shiro 下载文件时浏览器提示“无法下载-没有权限”或“无法下载-没有文件”问题

springboot shiro 下载文件时浏览器提示“无法下载-没有权限”或“无法下载-没有文件”问题 1. 预期效果2. 问题描述3. 问题排查4. 解决方案5. 总结 1. 预期效果 后端编写文件下载接口&#xff0c;前端通过浏览器的下载将文件保存到本地。 2. 问题描述 前后端代码在不同主机…...

ChatGLM-6B 部署与 P-Tuning 微调实战-使用Pycharm实战

国产大模型ChatGLM-6B微调部署入门-使用Pycharm实战 1.ChatGLM模型介绍 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本…...

【雕爷学编程】MicroPython动手做(11)——搭建掌控板IDE开发环境四种

为了能够打好基础&#xff0c;系统学习MicroPython&#xff0c;特地入手了二块掌控板 知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通…...

uniapp android底部弹框

uniapp android底部弹框&#xff0c;带有动画效果 <view class"popup_box"><view class"bottom_more" click"handleClickCancel"><image src"/static/images/rescue/icon_more.png"></image></view><…...

hashedWheelTimer类

hashedWheelTimer类 目录概述需求&#xff1a; 设计思路实现思路分析1.hashedWheelTimer类 拓展实现 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait …...

【自动化测试】Selenium IDE脚本编辑与操作

之前&#xff0c;我们录制脚本时是录制鼠标和键盘的所有在浏览器的操作&#xff0c;那么脚本会出现多余的步骤&#xff0c;有时候我们需要手动填写脚本或修改脚本&#xff0c;所以我们有必要对selenium IDE脚本编辑与操作有所了解&#xff1b;&#xff08;采用录制的方式很容易…...

杭电多校2023“钉耙编程”中国大学生算法设计超级联赛(5)

1006Touhou Red Red Blue dp 设状态方程为前i个数中&#xff0c;当前第一个包里面的是0/1/2/3状态&#xff0c;第二个包里面是0/1/2/3状态 0代表着还没有颜色&#xff0c;1代表R&#xff0c;2代表G&#xff0c;3代笔B颜色 初始状态都没选择颜色所以都是状态0 没选择颜色只…...

Matlab进阶绘图第24期—悬浮柱状图

悬浮柱状图是一种特殊的柱状图。 与常规柱状图相比&#xff0c;悬浮柱状图可以通过悬浮的矩形展示最小值到最大值的范围&#xff08;或其他范围表达&#xff09;&#xff0c;因此在多个领域得到应用。 本文使用自己制作的Floatingbar小工具进行悬浮柱状图的绘制&#xff0c;先…...

【题解】链表中倒数最后k个结点、删除链表的倒数第n个节点

文章目录 链表中倒数最后k个结点删除链表的倒数第n个节点 链表中倒数最后k个结点 题目链接&#xff1a;链表中倒数最后k个结点 解题思路1&#xff1a;先找长度再找k对应的节点 首先遍历一遍链表找到链表的长度n 然后比较长度和k的大小关系&#xff0c;如果比k小&#xff0c;…...

网络安全大厂面试题

自我介绍 有没有挖过src&#xff1f; 平时web渗透怎么学的&#xff0c;有实战吗&#xff1f;有过成功发现漏洞的经历吗&#xff1f; 做web渗透时接触过哪些工具 xxe漏洞是什么&#xff1f;ssrf是什么&#xff1f; 打ctf的时候负责什么方向的题 为什么要搞信息安全&#xff0c;对…...

7.事件类型

7.1鼠标事件 案例-轮播图点击切换 需求&#xff1a;当点击左右的按钮&#xff0c;可以切换轮播图 分析: ①右侧按钮点击&#xff0c;变量&#xff0c;如果大于等于8&#xff0c;则复原0 ②左侧按钮点击&#xff0c;变量–&#xff0c;如果小于0&#xff0c;则复原最后一张 ③鼠…...

ts中声明引入未使用的报错——解决方案

在编写ts项目的时候&#xff0c;经常会出现如下报错&#xff1a; 导入声明中的所有导入都未使用 这是因为导入的模块暂时没有使用&#xff0c;ts给的一个提示信息 解决方案&#xff1a; 在ts.config.json中 把noUnusedLocals 设置为false即可 {"compilerOptions"…...

集团MySQL的酒店管理系统

酒店管理系统 概述 基于Spring Spring MVC MyBatis的酒店管理系统&#xff0c;主要实现酒店客房的预定、入住以及结账等功能。使用Maven进行包管理。 用户端主要功能包括&#xff1a; 登录注册、客房预订、客房评论&#xff08;编写评论和查看评论&#xff09; 后台管理主要…...

Kotlin基础(九):对象和委托

前言 本文主要讲解kotlin对象和委托。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 对象 在Kotlin中&#xff0c;对象&#xff08;Object&#xff09;是一个具有特殊用途的单例实例。它是一种创建单个实例的方式&#xff0c;确保在整个应用程序中只存在一个特…...

八大排序算法--希尔排序(动图理解)

目录 希尔排序 概念 算法思路 动画演示 代码如下 复杂度分析 时间复杂度测试 运行结果 完整代码 创作不易&#xff0c;如果本篇博客对您有一定的帮助&#xff0c;大家记得留言点赞哦。 希尔排序 概念 希尔排序是插入排序的一种&#xff0c;是对直接插入排序的优化。其…...

数据结构之常见排序算法

文章目录 1.排序概念2.10种排序比较3.排序算法3.1直接插入排序&#xff08;元素越有序&#xff0c;越高效&#xff09;3.2希尔排序序( 缩小增量排序 )3.3直接选择排序3.5堆排序3.6冒泡排序3.8快速排序 递归实现&#xff08;无序使用最好&#xff09;3.8.1挖坑法 &#xff08;建…...

Java版企业电子招标采购系统源代码Spring Boot + 二次开发 + 前后端分离 构建企业电子招采平台之立项流程图

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及审…...

2.2 模型与材质基础

一、渲染管线与模型基础 1. 渲染管线 可编程阶段&#xff08;蓝色区域&#xff09;&#xff1a; 1顶点着色器 2几何着色器 3片元着色器 2. 模型的实现原理 UV&#xff1a;在建模软件中&#xff0c;进行UV展开&#xff0c;UV会放在一个横向为U纵向为V&#xff0c;范围&#xff0…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...