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.rhkb.cn/news/408178.html

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

相关文章

简易STL实现 | Vector的实现

1、内存管理 1、std::vector 维护了两个重要的状态信息&#xff1a;容量&#xff08;capacity&#xff1a;当前 vector 分配的内存空间大小&#xff09;和大小&#xff08;size&#xff1a; vector 当前包含的元素数量&#xff09; 2、当容量不足以容纳新元素时&#xff0c;s…

SSH 远程登录报错:kex_exchange_identification: Connection closed.....

一 问题起因 在公司,使用ssh登录远程服务器。有一天,mac终端提示:`kex_exchange_identification: Connection closed by remote host Connection closed by UNKNOWN port 65535`。 不知道为啥会出现这样的情形,最近这段时间登录都是正常的,不知道哪里抽风了,就提示这个。…

巴恩斯利蕨数学公式及源码实现——JavaScript版

为什么要写这篇文章 本篇接《张侦毅&#xff1a;巴恩斯利蕨数学公式及源码实现》。之前文章中源码的编程语言用的是Java&#xff0c;JDK的版本为8&#xff0c;现在我的JDK版本已经升级到22了&#xff0c;在新版本JDK中&#xff0c;原来的JApplet方法已经被废弃&#xff0c;不能…

鸿蒙实现在图片上进行标注

一.实现思路 现在需求是&#xff1a;后端会返回在这张图片上的相对位置&#xff0c;然后前端这边需要在图片上进行标注&#xff0c;就是画个框框圈起来&#xff0c;返回的数据里包括当前框的x,y坐标和图片大小&#xff0c;大体思路就是使用canvas绘制&#xff0c;使用鸿蒙的st…

vue-element-admin解决三级目录的KeepAlive缓存问题(详情版)

vue-element-admin解决三级目录的KeepAlive缓存问题&#xff08;详情版&#xff09; 本文章将从问题出现的角度看看KeepAlive的缓存问题&#xff0c;然后提出两种解决方法。本文章比较详细&#xff0c;如果只是看怎么解决&#xff0c;代码怎么改&#xff0c;请前往配置版。 一…

零工市场小程序应该有什么功能?

数字经济现如今正飞速发展&#xff0c;零工市场小程序在连接雇主与自由职业者方面发挥着越来越重要的作用。一个高效的零工市场小程序不仅需要具备基础的信息发布与匹配功能&#xff0c;还应该涵盖交易管理、安全保障以及个性化服务等多个方面。 那么&#xff0c;零工市场小程…

Ubuntu22.04下安装LDAP

目录 1 简单说明2 安装配置2.1 安装1、安装前准备2、安装 OpenLADP3、配置OpenLDAP4、设置基本组5、添加新组5、添加 OpenLDAP 用户 2.2 安装 LDAP 帐户管理器1、安装2、配置 LDAP 帐户管理器 3 简单使用3.1 创建一个组3.2 创建一个用户 总结 1 简单说明 之前写过在Centos下的…

nginx和tomcat负载均衡,动静分离

文章目录 一&#xff0c;tomcat1.tomca用途2.tomcat重要目录 二&#xff0c;nginx1.Nginx应用2.nginx作用3.nginx的正向代理和反向代理3.1正向代理3.2反向代理(单级)3.3反向代理(多级) 4.nginx负载均衡4.1Nginx支持的常见的分流算法1. 轮询(Round Robin):2.最少连接数(LeastCon…

[MRCTF2020]Hello_ misc

解压得一个png图片和一个flag.rar 图片拖入010editor 选择带zip头的这段蓝色全部复制&#xff0c;file-new-new Hex File&#xff0c;黏贴到新文件&#xff0c;另存为为1.zip 要密码,线索中断&#xff08;当然try to restore it.png&#xff0c;隐藏了zip压缩包&#xff0c;可…

uniapp - plugins的组件配置使用

点击进入到uniapp中mp-weixin的配置中 点击进入小程序的plugin的配置 在项目中&#xff0c;我们可引用插件的使用&#xff0c;例如一些快递100&#xff0c;点餐插件的业务引入 添加插件 在使用插件前&#xff0c;首先要在小程序管理后台的“设置-第三方服务-插件管理”中添加…

java ssl使用自定义证书或忽略证书

1.证书错误 Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 2.生成客户端证书 openssl x509 -in <(openssl s_client -connect 192.168.11.19:8101 -prexit 2>/dev/null) -ou…

C HTML格式解析与生成

cmake报错替换 if(NOT MyHTML_BUILD_WITHOUT_THREADS OR NOT MyCORE_BUILD_WITHOUT_THREADS) set(CMAKE_THREAD_PREFER_PTHREAD 1) if (WIN32) set(CMAKE_USE_WIN32_THREADS_INIT ON) set(CMAKE_THREAD_PREFER_PTHREADS TRUE) set(THREADS_PR…

windows配置jmeter定时任务

场景&#xff1a; 需要让脚本在指定的执行 步骤&#xff1a; 准备jmeter脚本&#xff0c;保证在命令行中可以调用脚本且脚本运行正常&#xff1a;"C:\Apache\jmeter\bin\jmeter.bat" -n -t C:\tests\test_plan.jmx -l C:\tests\results.jtl -t : 指定执行jmeter脚…

异步交互技术Ajax-Axios

目录 一、同步交互和异步交互 二、Ajax 1.概述 2.如何实现ajax请求 三、异步传输数据乱码的问题 regist.html页面代码 服务端代码处理 四、Axios 1. Axios的基本使用 &#xff08;1&#xff09;引入Axios文件 &#xff08;2&#xff09;使用Axios发送请求&#xff0…

通过Python绘制不同数据类型适合的可视化图表

在数据可视化中&#xff0c;对于描述数值变量与数值变量之间的关系常见的有散点图和热力图&#xff0c;以及描述数值变量与分类变量之间的关系常见的有条形图&#xff0c;饼图和折线图&#xff0c;可以通过使用Python的matplotlib和seaborn库来绘制图表进行可视化表达&#xff…

【大数据】什么是数据中台?

随着企业规模不断扩大、业务多元化——中台服务架构的应运而生。“中台”早期是由美军的作战体系演化而来的&#xff0c;技术上说的“中台”主要是指学习这种高效、灵活和强大的指挥作战体系。阿里在今年发布“双中台ET”数字化转型方法论&#xff0c;“双中台”指的是数字中台…

ResNet网络学习

简介 Residual Network 简称 ResNet (残差网络) 下面是ResNet的网络结构&#xff1a; ResNet详细介绍 原理 传统方法的问题&#xff1a; 对于一个网络&#xff0c;如果简单地增加深度&#xff0c;就会导致 梯度消失 或 梯度爆炸&#xff0c;我们采取的解决方法是 正则化。…

卸载nomachine

网上的方法:提示找不到命令 我的方法: step1. 终端输入 sudo find / -name nxserver 2>/dev/null确认 NoMachine 的实际安装路径。你可以使用 find 命令在系统中查找 nxserver 脚本的位置。 找到路径后,你可以使用该路径来卸载 NoMachine。 如下图,紫色框中是我的路径…

ProtoBuf简要介绍与快速上手使用(C++版)

文章目录 一、 初识ProtoBuf1. 序列化和反序列化概念2. ProtoBuf是什么3. ProtoBuf的使用特点 二、 讲解说明三、 快速上手1. 创建 .proto 文件2. 编译 contacts.proto 文件&#xff0c;生成C文件3. 序列化与反序列化的使用4. 小结 ProtoBuf 使用流程 一、 初识ProtoBuf 1. 序…

Linux权限维持实战

目录 介绍步骤 介绍 攻击者在获取服务器权限后&#xff0c;会通过一些技巧来隐藏自己的踪迹和后门文件 查看/tmp目录下的flag文件 查看/root目录下具有特殊文件属性的文件 操作机中共有几个SUID文件 操作机中共有几个SGID文件 查看操作机中ssh公私钥免密登陆 查看strace后门 …