Qt第十八章 XML和Json格式解析

文章目录

  • JSON
    • 格式
    • 解析
    • Json生成
    • 案例
  • XML
    • 简介
    • 与HTML的区别
    • 格式
    • XML解析
      • 流的方式
      • DOM
    • XML生成
  • JSON与XML的区别比较

JSON

格式

JSON是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个字面名

    1. 六个构造字符
    • 开始和结束数组:[ ]
    • 开始和结束对象:{ }
    • 名称分隔::(冒号)
    • 值分隔,(逗号)
    1. 字符串用双引号包含
    1. 数字直接表示,不用引号包含
    1. 三个字面量
    • true
    • false
    • null
  • 对象由花括号组成
{"name":"yerennuo","age":18,"adress":{"country":"china","city":"wuxi"}}
  • 数组由方括号组成
{"city":["无锡","南京","北京"]}

解析

void testJson()
{QJsonDocument jdoc;jdoc = QJsonDocument::fromJson(R"({ "Array" : [ true, 999, "string" ], "key" : "value", "null" : "null" })");qDebug() << jdoc.toJson(); // 以普通方式打印qDebug() << jdoc.toJson(QJsonDocument::Compact); // 压缩的方式,去掉了空白字符
}

Json生成

void creatJson()
{QJsonDocument doc;QJsonObject obj;obj.insert("name", QJsonValue("张三"));doc.setObject(obj);qDebug() << doc.toJson(); // 默认indented方式打印QJsonArray arr;arr.push_back("123");arr.push_back(true);arr.push_back(12);obj.insert("数组类型", arr);doc.setObject(obj);qDebug() << doc.toJson();
}

在这里插入图片描述

案例

在这里插入图片描述
拿到vesion的值,name的值,和ignoreFailures的值

void readJson()
{QFile file("../../launch.json");if (!file.open(QFile::ReadOnly | QFile::Text)) {qDebug() << "文件有误";return;}QJsonDocument doc;doc = QJsonDocument::fromJson(file.readAll());QJsonObject rootObj = doc.object(); // 拿到Json的根对象if (rootObj.isEmpty()) {qDebug() << "没获取到根对象";return;}// 定位到versionQJsonValue val = rootObj.value("version");qDebug() << val.toString();// 定位到nameval = rootObj.value("configurations");qDebug() << val[0]["name"].toString();// 取得ingnoreFailures的值qDebug() << val[0]["setupCommands"][0]["ignoreFailures"].toBool();
}

在这里插入图片描述

XML

简介

可扩展标记语言,标准通用标记语言Extensible Markup Language的子集,简称XML,是一种定义电子文档结构和描述其内容的国际标准语言,被设计用咯爱传输和存储数据。
XML的易于在任何应用程序中读写数据,这使XML很快成为数据交换的唯一公共语言,虽然不同的应用软件也支持其他的数据交换格式,但不久之后它们都将支持XML,那就意味着程序可以更容易的与Winows、Mac Os、Linux以及其他平台下产生的信息结合,然后可以很容易加载XML数据到程序中并分析它,并以XML格式输出结果

与HTML的区别

  1. 可扩展性方面:HTML不允许用户自定义它们自己的标识或属性,而XML可以
  2. 结构性方面:HTML不支持深层的结构描述,XML的文件结构嵌套可以复杂到任意程度,能表示面向对象的等级层次
  3. 可校验性方面:HTML没有提供规范文件以支持应用软件对HTML文件进行结构校验,而XML文件可以包括一个语法描述,使应用程序可以对文件进行结构校验
    总之,XML是一个简单而又灵活的标准格式,为基于Web的应用提供了一个描述数据和交换数据的有效手段。但是XML并非是用来取代HTML的。HTML着重如何描述将文件显示在浏览器中,而XML着重描述如何将数据以结构化方式表示。

格式

为了避免错误,需要规定XML编码,或者将XML文档存为Unicode。
XML文件格式是纯文本格式,具体规则如下:

  1. 必须有声明语句
<?xml version="1.0" encoding="UTF-8"?>
  1. 注意大小写
  2. XML文档有且只有一个根元素
  3. 属性值使用引号
<property name="geometry">
<width>800</width>
  1. 所有的标记必须有相应的结束标记
  2. 所有空标记也必须被关闭
<connections/>
  1. 实体引用
实体引用说明详细
&lt;<小于
&gt;>大于
&amp;&和号
&apos;单引号
&quot;"引号
  1. XML中的注释
<!-- 这是一个注释 -->
  1. XML中,空格会被保留

HTML会把连续的空格合并为一个
而在XML中,空格不会被删减

  1. XML以LF存储换行
  2. XML元素是指从开始标签到结束标签的部分,元素可包含其他元素、文本或者两者的混合物,元素也可以拥有属性

XML解析

在这里插入图片描述

流的方式

void phraseXML()
{QFile file("../../Widget.ui"); // 相对位置if (!file.open(QFile::ReadOnly | QFile::Text)) {qDebug() << "文件打开失败";return;}QXmlStreamReader reader;reader.setDevice(&file);reader.readNext(); // 读取声明语句qDebug() << "版本号" << reader.documentVersion()<< "编码方式" << reader.documentEncoding();while (!reader.atEnd()) {QXmlStreamReader::TokenType type = reader.readNext();switch (type) {case QXmlStreamReader::StartElement:if (reader.name().toString() == "ui")qDebug() << reader.attributes().value("version");else if (reader.name().toString() == "class") {reader.readNext();qDebug() << reader.text();} else if (reader.name().toString() == "widget")qDebug() << reader.attributes().value("class");elsereader.skipCurrentElement(); // 跳过当前元素break;case QXmlStreamReader::Comment:break;default:break;}}
}

DOM

需要先在cmake里添加Xml库

void phraseXML2()
{QDomDocument doc;QFile file("../../Widget.ui"); // 相对位置if (!file.open(QFile::ReadOnly | QFile::Text)) {qDebug() << "文件打开失败";return;}doc.setContent(file.readAll()); // 以二叉树形式存储数据qDebug() << doc.firstChild().nodeName() // 根节点键"xml"<< doc.firstChild().nodeValue(); // 根节点值"version='1.0' encoding='UTF-8'"QDomNodeList list = doc.elementsByTagName("property"); // 拿到所有名为property的节点for (int i = 0; i < list.size(); i++) {qDebug() << list.at(i).firstChild().nodeName(); //"rect" "string"}QDomElement root = doc.documentElement(); // 获取根标签qDebug() << root.attribute("version"); //"4.0"// 遍历while (!root.isNull()) {qDebug() << root.tagName();QDomNodeList list = root.childNodes(); // 遍历一层子节点,如果要遍历全部,使用递归if (!list.isEmpty()) {for (int i = 0; i < list.size(); i++) {root = list.at(i).toElement();qDebug() << root.tagName();}}root = root.nextSibling().toElement(); // 遍历兄弟节点}
}

XML生成

  1. 流的方式写入
void createXML()
{QXmlStreamWriter writer;QFile file("../../test.xml");if (!file.open(QFile::WriteOnly | QFile::Text)) {qDebug() << "打开文件失败";return;}writer.setDevice(&file);writer.setAutoFormatting(true); // 设置自动格式writer.writeStartDocument(); // 写入声明语句writer.writeStartElement("ui"); // 写入根节点writer.writeAttribute("version", "4.0");writer.writeStartElement("class"); // 写入子标签writer.writeEndElement();writer.writeStartElement("widget");writer.writeAttribute("class", "QWidegt");writer.writeAttribute("name", "Widegt");writer.writeEndElement();writer.writeTextElement("class", "widget"); // 写入文本标签writer.writeEndElement(); // 写结束标签writer.writeEndDocument();file.close();
}

在这里插入图片描述

  1. Dom
void createXML2()
{QFile file("../../test2.xml");if (!file.open(QFile::WriteOnly | QFile::Text)) {qDebug() << "打开文件失败";return;}QDomDocument doc;// 添加根节点QDomElement root = doc.createElement("ui");doc.appendChild(root);root.setAttribute("version", "4.0");// 添加其他节点QDomElement e1 = doc.createElement("class");root.appendChild(e1);e1.setAttribute("version", "123");// 设置文本节点QDomText t1 = doc.createTextNode("Widget");e1.appendChild(t1);QTextStream ts(&file);doc.save(ts, 4, QDomNode::EncodingFromTextStream); // 4是指定的缩进file.close();
}

在这里插入图片描述

JSON与XML的区别比较

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

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

相关文章

基于HarmonyOS的宠物收养系统的设计与实现(一)

基于HarmonyOS的宠物收养系统的设计与实现&#xff08;一&#xff09; 本系统是简易的宠物收养系统&#xff0c;为了更加熟练地掌握HarmonyOS相关技术的使用。 项目创建 创建一个空项目取名为PetApp 首页实现&#xff08;组件导航使用&#xff09; 官方文档&#xff1a;组…

机器学习辅助复合材料预测,性能管理优化创新材料,这种王炸般的组合,还真是大开眼界!

在人工智能与复合材料技术融合的背景下&#xff0c;复合材料的研究和应用正迅速发展&#xff0c;创新解决方案层出不穷。从复合材料性能的精确预测到复杂材料结构的智能设计&#xff0c;从数据驱动的材料结构优化到多尺度分析&#xff0c;人工智能技术正以其强大的数据处理能力…

Eureka 原理与实践全攻略

一、Eureka 概述 Eureka 在微服务架构中具有举足轻重的地位。它作为服务注册与发现的核心组件&#xff0c;为分布式系统中的服务管理提供了关键支持。 Eureka 的主要功能包括服务注册、服务发现、服务健康监测和自我保护机制。服务注册功能使得服务提供者能够在启动时将自身的…

git-版本管理工具基本操作-创建仓库-拉取-推送-暂存库-版本库

1、创建仓库和版本说明 2、克隆仓库到本地&#xff08;首次拉取需要输入用户名和密码&#xff0c;用户名用邮箱&#xff0c;密码用登录gitee的密码&#xff0c;后面配置密钥后可以直接clone&#xff09; 在命令行输出两行指令配置git才能克隆&#xff1a; username&#xff1…

《Web项目跨域请求后端Api设置Cookie失败问题?》

问题描述&#xff1a; 在web项目中跨域请求api时&#xff0c;api登录成功后需要向域名中设置cookie实现在两个域名下共享&#xff0c;但是登录接口返回成功&#xff0c;响应头中也有set-cookie&#xff0c;实际却无法设置到cookie中… web项目访问时的域名https://b.com/ api所…

解锁Spring Boot、Prometheus与Grafana三合一:打造你的专属自定义指标炫酷大屏!

1. 集成Prometheus到Spring Boot 需要在Spring Boot应用中集成Prometheus。可以通过micrometer库来实现。micrometer是一个应用程序监控库&#xff0c;它支持多种监控系统&#xff0c;包括Prometheus。 一招制胜&#xff01;Spring Boot、Prometheus和Grafana三剑合璧&#x…

银河麒麟服务器操作系统Kylin-Server-V10-SP3-2403-Release-20240426-x86_64安装步骤

银河麒麟服务器操作系统 Kylin-Server-V10-SP3-2403-Release-20240426-x86_64安装步骤 一、准备工作1. 下载ISO镜像2. 制作安装介质3. 设置BIOS 二、安装过程1. 启动系统2. 选择安装语言3. 选择安装配置4. 配置root密码与创建用户5. 开始安装6. 重启系统7. 同意许可协议 三、系…

【Redis】基本全局命令

Redis的基本全局命令 keysexistsdelexpirettltype Redis 有 5 种数据结构&#xff0c;但它们都是键值对种的值&#xff0c;对于键来说有⼀些通⽤的命令。 keys 返回所有满足样式 &#xff08;pattern&#xff09;的key。支持如下统配样式。 h?llo 匹配 hello , hallo 和 hxl…

培训班和科班出生有什么区别

IT业的萌新来啦 每到毕业季 总有大量萌新走进职场 IT圈子的程序员 有的是科班出生 比如 计算机科学与技术、软件工程、大数据技术 有的是相关专业出生的 比如 信息安全、网络工程、物联网工程等等 除此之外 还有各种其他专业转行过来的 文理不限、专业不限 科班出生…

【在Linux世界中追寻伟大的One Piece】IO基础

目录 1 -> 回顾 1.1 -> 回顾C文件接口 1.2 -> 总结 2 -> 系统文件I/O 3 -> 接口介绍 3.1 -> open 3.2 -> open函数返回值 3.3 -> 文件描述符fd 4 -> 0 & 1 & 2 5 -> 文件描述符的分配规则 6 -> 重定向 7 -> 使用dup2系…

运维开发——局域网SSH访问服务器与应用

摘要 本博文主要介绍局域网SSH访问登陆虚拟机和及其应用相关配置操作。 1. 局域网SSH访问登陆虚拟机 目标&#xff1a;在局域网内A电脑使用SSH登陆B电脑上虚拟机的服务器。 前提条件:B电脑为宿主机&#xff0c;可以正常使用ssh访问虚拟机服务器&#xff0c;虚拟机网络连接方…

深度学习基础—超参数调试

1.超参数调试顺序 在训练深度网络最难的事情之一是超参数的选择&#xff0c;如何选择合适的超参数取值&#xff1f;下面我将谈谈&#xff0c;如下是我所理解的超参数调试顺序&#xff1a; 重要性排序 超参数 Top1梯队 学习率a Top2梯队 min-batch大小&#xff0c;隐层神经…

QT-五子棋游戏

QT-五子棋游戏 一、演示效果二、核心代码三、下载链接 一、演示效果 二、核心代码 #include "GameModel.h" #include <time.h> #include <stdlib.h>GameModel::GameModel(){}void GameModel::startGame(GameType type){gameType type;//初始化棋盤game…

uniapp/vue如何实现一个子表单及子表单作用

子表单是一个辅助表单或一个表&#xff0c;它允许在主表单中添加多个行式项目&#xff0c;以处理与主记录相关联的多个辅助项目或数据。子表单在多种应用场景中发挥着重要作用&#xff0c;特别是在需要处理一对多关系的数据时。 以下是对子表单的详细解析&#xff1a; 定义与特…

90%的设计师都不知道的免抠图素材插件,水花免抠png素材轻松搞定!附保姆教程

你是否曾在设计中为绘制那些晶莹剔透的水花而苦恼&#xff1f;用PS太麻烦&#xff0c;细节根本抠不清楚&#xff1b;去素材网找&#xff0c;不是付费太高就是图案不满意&#xff01;可以试试千鹿设计助手的“AI免抠生成”插件&#xff0c;接下来我来分享一下我的一些使用过程和…

ardupilot开发 --- C嘎嘎 篇

长生不老&#xff1f;三界六道不就毁在这4个字上&#xff1f; 溜撒点一起上吧 cout和cin的使用&#xff0c;标准输入输出<< 和 >> 的使用数据类型&#xff08;函数&#xff09;模板的使用&#xff1a;命名空间的使用&#xff0c;std命名空间语句块new 的使用引用 &…

fiddler在软件测试中的使用(详细版)

1.抓包&#xff0c;辅助定位bug&#xff08;web中类似谷歌浏览器F12开发调试工具&#xff09; 合格的软件测试工程师&#xff0c;不仅仅需要能够发现bug&#xff0c;还需要能透过bug表象&#xff0c;分析出问题根本原因&#xff0c;从而提升bug的解决效率&#xff0c;通过fidd…

手机使用技巧:如何恢复Android手机不见的短信

在您的 Android 手机上丢失短信可能是一种令人沮丧的经历&#xff0c;尤其是在文本包含重要信息的情况下。幸运的是&#xff0c;有一些方法可以在Android上恢复已删除的短信。在这篇博文中&#xff0c;我们将讨论几种在Android手机上恢复已删除短信的方法。 为什么需要恢复Andr…

vue2版本空目录下创建新项目的方法2024

vue2版本空目录下创建新项目的方法2024 node -v npm -v vue -V 安装vue-cli 2.9版本的命令 npm install vue-cli -g 卸载vue2.x方法&#xff1a; npm uninstall vue-cli -g 设置 NPM 镜像 npm config set registry https://registry.npmmirror.com vue -V 报错时需设置环…

JVM的内存模型和垃圾回收

JVM内存区域 内存模型图&#xff1a; 堆 线程共享。所有的对象实例以及数组都要在堆上分配。回收器主要管理的对象。 它的目的是存放对象实例。同时它也是GC所管理的主要区域&#xff0c;因此常被称为GC堆&#xff0c;又由于现在收集器常使用分代算法&#xff0c;Java堆中还…