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);
   }

   // 写入新的 topic
   QDomElement 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;
    }

    // 查找要修改的 topic
    QDomNodeList 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;
        }
    }

    // 没有找到要修改的 topic
    file.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;
    }

    // 查找要修改的 topic
    QDomNodeList 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;
        }
    }

    // 没有找到要修改的 topic
    file.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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

复现原型链污染漏洞

目录 一、复现原型链污染漏洞 hackit 2018 1、创建hackit_2018.js文件 2、运行hackit_2018.js文件 3、寻找原型链漏洞 4、污染原型链 hackit 2018 1、创建hackit_2018.js文件 const express require(express) var hbs require(hbs); var bodyParser require(body-par…

【数据结构】快速排序

快速排序是一种高效的排序算法&#xff0c;其基本思想是分治法。它将一个大问题分解成若干个小问题进行解决&#xff0c;最后将这些解合并得到最终结果。 快速排序的主要思路如下&#xff1a; 选择一个基准元素&#xff1a;从待排序的数组中选择一个元素作为基准&#xff08;…

计算机视觉(五)深度学习基础

文章目录 深度学习基础卷积神经网络与传统神经网络区别深度学习与神经网络的区别 目标函数选择合适的目标函数Softmax层 改进的梯度下降梯度消失的直观解释激活函数学习步长SGD的问题Momentum动量Nesterov MomentumAdagradRMSpropAdam 各种梯度下降算法比较关于算法选择的建议B…

redis入门2-命令

Redis的基本数据类型 redis的基本数据类型&#xff08;value&#xff09;: string,普通字符串 hash&#xff08;哈希&#xff09;,适合存储对象 list(列表),按照插入顺序排序&#xff0c;可以由重复的元素 set(无序集合)&#xff0c;没有重复的元素 sorted set(有序集合)&…

华为数通HCIP-PIM原理与配置

组播网络概念 组播网络由组播源&#xff0c;组播组成员与组播路由器组成。 组播源的主要作用是发送组播数据。 组播组成员的主要作用是接收组播数据&#xff0c;因此需要通过IGMP让组播网络感知组成员位置与加组信息。 组播路由器的主要作用是将数据从组播源发送到组播组成员。…

【Ansible】Ansible自动化运维工具之playbook剧本搭建LNMP架构

LNMP 一、playbooks 分布式部署 LNMP1. 环境配置2. 安装 ansble3. 安装 nginx3.1 准备 nginx 相关文件3.2 编写 lnmp.yaml 的 nginx 部分3.3 测试 nginx4. 安装 mysql4.1 准备 mysql 相关文件4.2 编写 lnmp.yaml 的 mysql 部分4.3 测试 mysql5. 安装 php5.1 编写 lnmp.yaml 的 …

Datax 数据同步-使用总结(一)

1&#xff0c;实时同步&#xff1f; datax 通常做离线数据同步使用。 目前能想到的方案 利用 linux 的定时任务时间戳的方式做增量同步。 2&#xff0c;同步速度快不快&#xff1f; 单表同步速度还是挺快的 但是如果遇到复杂的 sql 查询&#xff0c;其同步效率&#xff0c…

opencv-34 图像平滑处理-双边滤波cv2.bilateralFilter()

双边滤波&#xff08;BilateralFiltering&#xff09;是一种图像处理滤波技术&#xff0c;用于平滑图像并同时保留边缘信息。与其他传统的线性滤波方法不同&#xff0c;双边滤波在考虑像素之间的空间距离之外&#xff0c;还考虑了像素之间的灰度值相似性。这使得双边滤波能够有…

《面试1v1》ElasticSearch 和 Lucene

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

问道管理:沪指窄幅震荡跌0.18%,有色、汽车等板块走低

3日早盘&#xff0c;沪指盘中窄幅震动下探&#xff0c;创业板逆市上扬&#xff1b;两市半日成交不足5000亿元&#xff0c;北向资金净卖出超15亿元。 到午间收盘&#xff0c;沪指跌0.18%报3255.88点&#xff0c;深成指跌0.23%&#xff0c;创业板指涨0.2%&#xff1b;两市算计成交…

6.如何用CSV文件生成异构图数据集

我们将使用GroupLens研究小组收集的MovieLens数据集。 这个数据集描述了MovieLens的五星评级和标记活动。该数据集包含来自600多名用户的9000多部电影的约10万个评分。我们将使用该数据集生成两种节点类型&#xff0c;分别保存电影和用户的数据&#xff0c;以及一种连接…

两个镜头、视野、分辨率不同的相机(rgb、红外)的视野校正

文章目录 背景实际效果查找资料资料1资料2 解决方案最终结果 背景 目前在做的项目用到两个摄像头&#xff0c;一个是热成像摄像头、另一个是普通的rgb摄像头。 一开始的目标是让他们像素级重合&#xff0c;使得点击rgb图像时&#xff0c;即可知道其像素对应的温度。但是在尝试…

spark history网络流量占用高问题记录

生产环境遇到一台机器网络流量占用高告警 由于监控只有机器总的网络流量&#xff0c;没有具体进程的 于是只能登陆服务器&#xff0c;安装nethogs&#xff1a;yum install nethogs 然后执行nethogs命令查看进程流量 观察到主要是spark history server这个进程占用流量高(最高…

【树】 二叉树 堆与堆排序 平衡(AVL)树 红黑(RB)树

目录 1 树1.1 认识树1.2 树的相关概念1.3 树的表示孩子兄弟表示法 2 二叉树2.1 概念2. 2 特殊二叉树2.3 二叉树的性质2.4 二叉树的存储结构 3 堆 — 完全二叉树的顺序结构实现3.1 堆的概念3.2 核心代码3.3 堆应用1 堆排序2 TOP-K问题 4 二叉树的链式存储4.1 二叉链结构与初始化…

4G WWAN设备类型

WWAN设备类型 USB dongle是设备接入互联网的重要方式之一&#xff0c;典型的通过USB接口与主设备连接&#xff0c;然后主设备通过4G/5G接入互联网&#xff0c;作为移动宽带设备&#xff0c;它有那些设备类型及暴露方式呢&#xff1f; 移动宽带设备类型&#xff1a;ModemManage…

vue-cli3项目优化

首先添加两个量化的插件&#xff0c;方便对项目目前的情况进行分析&#xff1a; 1.添加speed-measure-webpack-plugin插件 —量化的指标可以看出前后对比 使用步骤&#xff1a; 安装speed-measure-webpack-plugin依赖 npm install speed-measure-webpack-plugin -D配置vue.c…

【微信小程序】van-uploader实现文件上传

使用van-uploader和wx.uploadFile实现文件上传&#xff0c;后端使用ThinkPHP。 1、前端代码 json&#xff1a;引入van-uploader {"usingComponents": {"van-uploader": "vant/weapp/uploader/index"} }wxml&#xff1a;deletedFile是删除文件函…

【Linux 网络】 传输层协议之TCP协议 TCP的三次握手和四次挥手

TCP协议 TCP协议段格式谈谈什么是 “可靠” 和 “不可靠”TCP协议段——序号与确认序号TCP协议段——窗口大小TCP协议段 —— 六个标志位确认应答机制&#xff08;ACK&#xff09;超时重传机制连接管理机制TCP 的三次握手四次挥手TCP三次握手四次挥手总结图 滑动窗口流量控制拥…

HCIP中期实验

1、该拓扑为公司网络&#xff0c;其中包括公司总部、公司分部以及公司骨干网&#xff0c;不包含运营商公网部分。 2、设备名称均使用拓扑上名称改名&#xff0c;并且区分大小写。 3、整张拓扑均使用私网地址进行配置。 4、整张网络中&#xff0c;运行OSPF协议或者BGP协议的设备…

LabVIEW深度相机与三维定位实战(下)

‍‍&#x1f3e1;博客主页&#xff1a; virobotics的CSDN博客&#xff1a;LabVIEW深度学习、人工智能博主 &#x1f384;所属专栏&#xff1a;『LabVIEW深度学习实战』 &#x1f37b;上期文章&#xff1a;『LabVIEW深度相机与三维定位实战&#xff08;上&#xff09;』 &#…
最新文章