Qt json和xml操作

news2024/9/23 11:18:47

 

学习目标: 认识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 然后再取值再tostring
    QString 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.coloradmin.cn/o/1906530.html

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

相关文章

TypeSscript 学习(一)

一、为什么使用 TypeScript 因为 js 是一种 弱类型语言 编写代码比较灵活 但是当项目比较大时 这种灵活不利于维护 我们用 TypeScript 这种强类型的语言 比较利于维护 二、语法 1.类型推断 ts 通过我们写的内容 知道变量的类型 定义 str 为 abc 以后 str 只能存 字符串…

element-ui操作表格行内容如何获取当前行索引?

需求&#xff1a; 根据每个用户的提交次数、撤回次数&#xff0c;动态计算出实际次数&#xff0c;并且提交次数不能小于撤回次数 <template><div><el-table:data"tableData"style"width: 80%"border><el-table-columnprop"date&…

俄罗斯VK与Yandex,谁的优势更胜一筹?

俄罗斯VK和Yandex作为该国两大重要的网络平台&#xff0c;各自具有独特的优势。 VK是一个社交媒体巨头&#xff0c;以其庞大的用户基础著称。 这个平台不仅拥有超过数亿的注册用户&#xff0c;而且这些用户在平台上的活跃度极高&#xff0c;每天都会产生海量的内容与互动。 …

优优嗨聚集团:餐饮新纪元,揭秘餐饮合作背后的双赢奥秘

在竞争激烈的餐饮市场中&#xff0c;单打独斗早已不再是主流&#xff0c;而餐饮合作却成为了一种新的趋势。那么&#xff0c;餐饮合作究竟有哪些优势&#xff0c;能够吸引众多餐饮从业者纷纷投身其中呢&#xff1f;本文将为您揭秘餐饮合作背后的双赢奥秘。 一、资源共享&#x…

go-redis 封装事件-client封装模型、批量数据处理的导出器设计

一、redis-go的封装实践-client模型 // Copyright 2020 Lingfei Kong <colin404foxmail.com>. All rights reserved. // Use of this source code is governed by a MIT style // license that can be found in the LICENSE file.package storageimport ("context&q…

(19)夹钳(用于送货)

文章目录 前言 1 常见的抓手参数 2 参数说明 前言 Copter 支持许多不同的抓取器&#xff0c;这对送货应用和落瓶很有用。 按照下面的链接&#xff08;或侧边栏&#xff09;&#xff0c;根据你的设置了解配置信息。 Electro Permanent Magnet v3 (EPMv3)Electro Permanent M…

老胡的周刊(第149期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 mesop[2] Mesop 是一个基于 Python 的 UI 框…

【机器学习】——决策树模型

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

基于Java+SpringMvc+Vue技术的在线学习交流平台的设计与实现---60页论文参考

博主介绍&#xff1a;硕士研究生&#xff0c;专注于Java技术领域开发与管理&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架构思想、较扎实的技术功底和资深的项目管理经…

vulhub-activemq(CVE-2016-3088)

在 Apache ActiveMQ 5.12.x~5.13.x 版本中&#xff0c;默认关闭了 fileserver 这个应用&#xff08;不过&#xff0c;可以在conf/jetty.xml 中开启&#xff09;&#xff1b;在 5.14.0 版本后&#xff0c;彻底删除了 fileserver 应用。【所以在渗透测试过程中要确定好 ActiveMQ …

Avalonia 常用控件四 Text Controls

1、AutoCompleteBox <StackPanel Margin"20"><TextBlock Margin"0 5">选择一种动物</TextBlock><AutoCompleteBox x:Name"animals" FilterMode"StartsWith"/><!--AutoCompleteBox:Items:要匹配的项目列表。…

Redis集群篇

目录 传送门前言一、Redis主从复制二、Redis哨兵模式&#xff08;自动选举老大的模式&#xff09;三、Redis集群架构&#xff08;最佳&#xff09;四、Redis缓存穿透和雪崩&#xff08;面试高频&#xff09; 传送门 SpringMVC的源码解析&#xff08;精品&#xff09; Spring6的…

唤醒知识循环,共筑绿色阅读梦——探索旧书回收小程序的无限可能

在这个信息爆炸的时代&#xff0c;书籍作为知识与智慧的载体&#xff0c;其重要性不言而喻。然而&#xff0c;随着电子阅读的兴起和书籍更新换代的加速&#xff0c;大量旧书被束之高阁&#xff0c;甚至面临被遗弃的命运。这不仅是对宝贵文化资源的浪费&#xff0c;也是对环境保…

51单片机嵌入式开发:5、按键、矩阵按键操作及protues仿真

按键、矩阵按键操作及protues仿真 1 按键介绍1.1 按键种类1.2 按键应用场景 2 按键电路3 按键软件设计3.1 按键实现3.2 按键滤波方法3.3 矩阵按键软件设计3.4 按键Protues 仿真 4 按键操作总结 提示 1 按键介绍 1.1 按键种类 按键是一种用于控制电子设备或电路连接和断开的按…

UGC与AI引领的下一个10年,丝芭传媒已经准备好

丝芭传媒最近传来的消息&#xff0c;都跟技术相关。 基于自研AI大模型“Paro&#xff08;心乐舞河&#xff09;”的AIGPT及AIGC生成工具APP“鹦鹉人”开启用户内测。2023年3月技术测试的图形化智能社交基座“美踏元宇宙”&#xff0c;也将开放首轮用户内测。 此外&#xff0c…

搭建一个成功的短视频社区,你需要知道这些

近年来&#xff0c;短视频以其独特的魅力在全球范围内迅速崛起。无论是抖音、快手等国内巨头的迅速扩张&#xff0c;还是国外各类短视频应用的不断涌现&#xff0c;都证明了短视频时代的来临。短视频以其消费门槛低、娱乐性强、信息获取快等特点&#xff0c;赢得了广大用户的青…

node使用express在服务器上创建接口,携带参数访问时返回参数

一、下载nodejs​​​​​​Node.js — 在任何地方运行 JavaScriptNode.js is a JavaScript runtime built on Chromes V8 JavaScript engine.https://nodejs.org/zh-cn 二、 安装Express 找一个文件夹&#xff0c;创建 mkdir myapp cd myapp三、初始化一个新的Node.js项目&…

入门PHP就来我这(高级)15 ~ 图书删除功能

有胆量你就来跟着路老师卷起来&#xff01; -- 纯干货&#xff0c;技术知识分享 路老师给大家分享PHP语言的知识了&#xff0c;旨在想让大家入门PHP&#xff0c;并深入了解PHP语言。 今天给大家接着上篇文章实现图书删除功能&#xff0c;来实现删除图书信息记录行的功能。 1 删…

HTML-CSS 入门介绍

1.web 网站的工作流程 2.web前端开发 简单示例 <html> <head> <title>HTML快速入门</title> </head> <body> <h1>Hello HTML</h1> <img src1.jpg></img> <img src1.jp…

RPA影刀 | 循环 + 嵌套循环 + 循环中的continue和break

一、循环 循环的构成 重复在做的事&#xff08;不变的&#xff09;&#xff1a;循环体每次操作的对象&#xff08;变化的&#xff09;&#xff1a;循环项 二、ForEach列表循环 三、循环相似元素 四、For次数循环 五、嵌套循环 测试目标&#xff1a;遍历所有页面&#xff0…