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

news2024/9/22 11:28:22

文章目录

  • 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;
    }
    // 定位到version
    QJsonValue val = rootObj.value("version");
    qDebug() << val.toString();

    // 定位到name
    val = 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");
            else
                reader.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.coloradmin.cn/o/2069796.html

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

相关文章

应用商场的搭建

前言&#xff1a; 使用mysql做主从设置&#xff0c;redis数据库做热门访问数据库。mycat读写分离&#xff0c;zookeeperkafka做数据收集&#xff0c;使用三台虚拟机 关掉防火墙和selinux,做时间同步 192.168.121.11 node1 mycat.example.com 192.168.121.21 node2 …

提高LabVIEW电机控制速度

在LabVIEW中执行绝对位移命令时&#xff0c;其运行时间主要与以下电机参数有关&#xff1a; 电机加速度和减速度&#xff1a; 加速度和减速度参数决定了电机从静止到达到目标速度&#xff0c;以及从高速到停止的时间。这些参数直接影响电机响应的迅速程度。如果加速度和减速度设…

如何使用ssm实现基于bs模式的医院在线挂号预约系统的设计与实现

TOC ssm072基于bs模式的医院在线挂号预约系统的设计与实现jsp 第1章 绪论 1.1 课题背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人…

B/S架构和C/S架构的区别

B/S架构、C/S架构区别 1. B/S架构 1.1 什么是B/S架构 B/S架构的全称为Browser/Server&#xff0c;即浏览器/服务器结构。Browser指的是Web浏览器&#xff0c;极少数事务逻辑在前端实现&#xff0c;但主要事务逻辑在服务器端实现。B/S架构的系统无须特别安装&#xff0c;只需要…

实战OpenCV之绘制图形

基础入门 OpenCV除了用于图像显示之外&#xff0c;还提供了一系列接口和工具&#xff0c;以帮助开发者在图像上绘制各种图形。这里的图形包括&#xff1a;直线、矩形、圆形、椭圆、多边形等。另外&#xff0c;OpenCV还支持在图像上添加文字&#xff0c;对多张图像进行叠加操作。…

NACOS 2.4.1如何开启账号密码登录功能

Nacos Server 2.4.0+已正式发布取消管理员用户 nacos 的默认密码支持初始化指定密码。 本章教程,主要介绍如何给nacos加上鉴权,支持通过用户名和密码的方式进行访问nacos页面。 NACOS 2.4.1版本下载地址:https://github.com/alibaba/nacos/releases/tag/2.4.1 1、开启认证功…

驱动:insmod

一、驱动模块的加载 1. 静态 编译进内核2. 动态 编译成模块 如下&#xff1a; 解决方法 结果 led电灯例子 创建一个led.c 修改Makefile、Kconfigmake modulescp drivers/char/led.ko /home/linux/nfs/rootfs开发板 insmod led.ko去 /home/linux/nfs/rootfs 上 写程序.carm-l…

每日掌握一个科研绘图|区域图·24-08-23

小罗碎碎念 为了方便大家获取对应的代码和源数据&#xff0c;从本期推文开始&#xff0c;我将把对应的文件上传至Github仓库&#xff0c;感兴趣的同学自行获取。 仓库地址 https://github.com/Lxltxpku/Share 一、区域图 区域图是一种数据可视化工具&#xff0c;它通过在坐标…

嵌入式人工智能ESP32(7-OLED显示中英文)

1、OLED显示英文 我们之前通过树莓派开发板做过OLED显示&#xff0c;这里就不再赘述OLED显示屏了。直接上接线图与代码。 &#xff08;1&#xff09;Adafruit Adafruit是一家成立于2005年的私营企业&#xff0c;主要业务是设计和制造开源电子硬件。Adafruit在美国设计和制造其…

全栈杂谈第一期:什么是计算机中的并发

什么是计算机中的并发 计算机中的“并发”是一个听起来很复杂的词汇&#xff0c;但我们可以把它简单理解为“同时做很多事情”。想象一下你正在做晚饭&#xff1a;你可以在等水烧开的时候切菜&#xff0c;还可以在等待炖汤时洗碗。尽管你只有一双手&#xff0c;但通过合理安排…

芋道cloud v2.2.0发布,支持模块选配,丢弃简易版

大家知道&#xff0c;芋道cloud拥有商城、CRM、ERP、微信相关等模块&#xff0c;很显然我们在日常开发中不可能一个项目同时拥有这么多模块。但是从gitee上获取代码的时候&#xff0c;只提供了简易版和完整版。简易版本只有最基础的功能&#xff0c;如果想要微信相关的模块&…

浅谈Llama3.1,从结构、训练过程、影响到数据合成

Llama3.1系列模型的开源&#xff0c;真让大模型格局大震&#xff0c;指标上堪比最好的闭源模型比如GPT 4o和Claude3.5&#xff0c;让开源追赶闭源成为现实。 这里给大家分享一篇俊林兄&#xff08;知乎张俊林&#xff09;的一篇解读&#xff0c;主要对LLaMA3.1的模型结构、训练…

RM双轴云台控制

RM机器人上最复杂的控制计构就是双轴云台了&#xff0c;赛场上的情况对双轴云台的控制稳定度与响应灵敏度双方面都提出了很高的要求&#xff0c;云台控制的好坏在一定程度上就能够代表一支队伍的实力。 双轴云台采用的控制算法依然是PID控制算法&#xff0c;关于PID控制算法的…

自动操作一键数据恢复/电子取证

对磁盘模拟扫描修复丢失数据的实验。 先挂载题目磁盘VHD。 Windows系统中打开磁盘管理&#xff0c;-操作&#xff0c;-附加VHD 可以看到已经加载出题目磁盘&#xff0c;接下来打开RStudio数据恢复软件&#xff0c;对其进行扫描。 操作找回丢失/被删除的数据 可以看到已经加载出…

Java入门:06.Java中的方法--进阶04

4方法递归 简而言之就是方法的自身调用。 也可以是方法组自身的调用 递归类似循环&#xff0c;可以实现功能的反复执行。在某些(算法)环境下&#xff0c;比使用循环更轻松。 递归的本质就是方法的不同调用&#xff0c;就会不同的产生栈帧压栈&#xff0c;栈空间有限&#xff…

一个可以搜索页面内超链接的HTML页面

页面效果如上&#xff0c;含有标题&#xff0c;搜索框和一些超链接&#xff0c;在搜索框输入一些文字可以在下方显示含有这些文字的超链接。这里的搜索不仅可以中文&#xff0c;还可以是英文&#xff0c;数字 HTML代码如下 <!DOCTYPE html> <html lang"en&qu…

笔记小结:《利用pytthon进行数据分析》之使用pandas和seaborn绘图

matplotlib实际上是一种比较低级的工具。要绘制一张图表&#xff0c;你组装一些基本组件就行&#xff1a;数据展示&#xff08;即图表类型&#xff1a;线型图、柱状图、盒形图、散布图、等值线图等&#xff09;、图例、标题、刻度标签以及其他注解型信息。 在pandas中&#xf…

polarctf靶场[CRYPTO]显而易见的密码、[CRYPTO]夏多的梦、[CRYPTO]再这么说话我揍你了、[CRYPTO]神秘组织M

[CRYPTO]显而易见的密码 考点&#xff1a;ntlm编码 打开文件&#xff0c;显示内容就是ntlm格式 ntlm解密 在线网站&#xff1a; https://www.cmd5.com/便可得到flag [CRYPTO]夏多的梦 根据题目提示可以猜测为夏多密码 考点&#xff1a;夏多密码 在线加密原理网站&#x…

如何使用ssm实现应急资源管理系统

TOC ssm074应急资源管理系统jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。…

WEB渗透Win提权篇-RDPFirewall

爆破RDP Hydra爆破RDP >hydra -l admin -P /root/Desktop/passwords -S 192.168.0.0 rdpNlbrute MSF开启 >run post/windows/manage/enable_rdp多用户登陆 Mimikatz设置允许多用户登录 >privilege::debug >ts::multirdprdpwrap GitHub - stascorp/rdpwrap: RD…