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

news2024/9/22 17:33:33

文章目录

  • 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.coloradmin.cn/o/818801.html

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

相关文章

“效能指标”,该由谁来定义?| 谈效风生

第5期&#xff1a;效能指标&#xff0c;该由谁来定义&#xff1f; 回顾上期《「自动化」聊起来简单&#xff0c;做起来难》我们聊了聊如何打造「自动化」的事&#xff0c;这也是真正实现研发效能提升的必要条件。从单点自动化提升效率&#xff0c;到全工具链自动化&#xff0c;…

常微分方程建模R包ecode(二)——绘制相速矢量场

本节中我们考虑一个更为复杂的常微分方程模型&#xff0c; d X C d t ν ( X A Y A ) − β ⋅ X C ⋅ ( Y C Y A ) − ( μ g ) ⋅ X C , ( 1 ) d Y C d t β ⋅ X C ⋅ ( Y C Y A ) − ( μ g ρ ) ⋅ Y C , ( 2 ) d X A d t g ⋅ X C − β ⋅ X A ⋅ ( Y C Y A …

2023最新版本~十分钟零基础搭建EMQX服务器

购买服务器 已知服务器大厂商 1 阿里云 点击直接访问 2 华为云点击直接访问 3 腾讯云 点击直接访问 还是比较推荐大公司 不会跑路 这里我购买的是一年的华为云服务器(新用户 64一年) 镜像推荐乌班图18 登陆服务器&#xff08;需要重置密码&#xff01;&#xff01;&…

Ansible自动化运维工具 —— Playbook 剧本

playbooks 本身由以下各部分组成 &#xff08;1&#xff09;Tasks&#xff1a;任务&#xff0c;即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行 &#xff08;2&#xff09;Variables&#xff1a;变量 &#xff08;3&#xff09;Templates&#xff1a;模…

ubuntu16.04忘记密码了怎么办,亲测有效

由于装载Ubuntu系统的电脑&#xff08;非虚拟机&#xff09;好久没有用&#xff0c;忘记了密码&#xff0c;只能进行密码重置&#xff0c;亲测有效&#xff1a; 1.首先ubuntu系统开机&#xff0c;期间按着shift键不放&#xff0c;选择高级选项。 2.enter键进入如下界面&#x…

python-occ入门指北

0、系统环境: Win10 在Windows环境中玩PythonOCC比较简单的方式是使用anaconda的cmd prompt或者powershell的prompt&#xff0c;这里我用的是cmd。PowerShell也有很多粉丝&#xff0c;但是个人真的觉得这个东西挺鸡肋的。 另外在Win10或Win11上另一个玩法是使用WSL2&#xff…

【漏洞挖掘】Xray+rad自动化批量漏洞挖掘

文章目录 前言一、挖掘方法二、使用步骤工具安装使用方法开始挖掘 总结 前言 自动化漏洞挖掘是指利用计算机程序和工具来扫描、分析和检测应用程序、网络和系统中的安全漏洞的过程。这种方法可以帮助安全专家和研究人员更高效地发现和修复潜在的安全威胁&#xff0c;从而提高整…

企业级开发中协同开发与持续集成持续部署

文章目录 1 创建代码仓库2 使用git协同开发2.1 独立团队开发2.2 多团队开发git工作流 2 持续集成和持续部署2.1 创建docker镜像2.2 使用coding构建 1 创建代码仓库 每个项目有唯一的代码仓库&#xff0c;所以不是每个开发者都需要创建一个代码仓库&#xff0c;一般都是项目负责…

Node版本自由切换之nvm安装教程

1.nvm安装包下载&#xff0c;这里推荐1.1.7版本 https://github.com/coreybutler/nvm-windows/releases/download/1.1.7/nvm-setup.zip 2.解压后运行exe文件&#xff0c;一路默认就可以了&#xff0c;自定义的话&#xff0c;文件路径不要有中文&#xff1b; 3.安装之后使用命…

CloudCompare软件手册01

1. 介绍 1.1 历史 CloudCompare是一个3D点云(和三角形网格)编辑和处理软件。 最初&#xff0c;它被设计用于在密集的3D点云之间进行直接比较。它依赖于一种特定的八叉树结构&#xff0c;在执行这类任务时&#xff0c;这种结构能够提供出色的性能。此外&#xff0c;由于大多数…

基于python+Xception算法模型实现一个图像分类识别系统

一、目录 Xception介绍数据集处理模型训练模型评估项目扩展 二、Xception介绍 在计算机视觉领域&#xff0c;图像识别是一个非常重要的任务&#xff0c;其应用涵盖了人脸识别、物体检测、场景理解等众多领域。随着深度学习技术的发展&#xff0c;深度卷积神经网络&#xff0…

C++继承——多继承问题

目录 单继承&#xff1a; 多继承&#xff1a; 菱形继承&#xff1a;菱形继承是多继承的一种特殊情况。 三.菱形继承的两种解决方式区别&#xff1a; 3.1采用作用域解决的菱形继承&#xff1a; 检测器运行图&#xff1a; 反汇编运行图&#xff1a; 3.1菱形虚继承&…

webstorm配置less转译

Program中路径如果识别不到 项目文件\node_modules.bin\lessc

如何优雅的显示404页面

源码&#xff1a;mumangguo/404-notfound - 码云 - 开源中国https://gitee.com/mumangguo/404-notfound 1.孤独型404页面 2.酷炫效果404页面 3.太空404页面 4.404寻亲页面&#xff08;公益&#xff09; 每一次刷新都是一个公益捐赠活动&#xff01; 以上就是笔者要分享的4个4…

【H5移动端】常用的移动端方案合集-键盘呼起、全面屏适配、图片大小显示、300ms点击延迟、首屏优化(不定期补充~)

文章目录 前言键盘呼起问题靠近底部的输入项被键盘遮挡底部按钮被顶上去 全面屏适配图片大小显示问题解决300ms延迟首屏优化 前言 这篇文章总结了我在工作中做H5遇到的一些问题&#xff0c;包括我是怎么解决的。可能不是当下的最优解&#xff0c;但是能保证解决问题。 单位适…

【hive】Install hive using mysql as hive metadata service

文章目录 一. Requirements二. Installing Hive from a Stable Release三. Running Hive四. Running Hive CLI五.Running HiveServer2 and Beeline1. 下载安装mysql2. 下载mysql驱动3. 配置hive-site.xml4. 初始化元数据库5. 通过beeline进行连接 一. Requirements Users are s…

简易博客系统自动化测试

&#x1f349;作者 Autumn60 &#x1f3c4;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f472;微语 &#xff1a;只有镜子和钱包&#xff0c;可以告诉你生活中&#xff0c;大部分的为什么和凭什么 文章目录 目录 文章目录 概述: 测试方法&am…

自动化测试和手动测试相比,哪个更具优势?

在软件测试行业中&#xff0c;争议最大的话题是“更好的是手动测试还是自动化测试”。尽管自动化测试最常谈论流行语&#xff0c;并且正在慢慢主导测试领域&#xff0c;手动测试的必要性不可忽视。 在本文中&#xff0c;将探讨手动测试和自动化测试之间的更深差异。 什么是手动…

javascript实现几何粒子星空连线背景效果

javascript实现几何粒子星空连线背景效果 <html><head><meta charset"UTF-8"><title>几何星空连线背景</title><script src"./ParticleBackground.js"></script> </head><body><canvas id"…

【计算机视觉】BLIP:统一理解和生成的自举多模态模型

文章目录 一、导读二、背景和动机三、方法3.1 模型架构3.2 预训练目标3.3 BLIP 高效率利用噪声网络数据的方法&#xff1a;CapFilt 四、实验4.1 实验结果4.2 各个下游任务 BLIP 与其他 VLP 模型的对比 一、导读 BLIP 是一种多模态 Transformer 模型&#xff0c;主要针对以往的…