当前位置: 首页 > news >正文

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的区别比较

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 理解Flink数据流图
  • Java码农35岁之后只能送外卖?
  • 人工智能初学者学习路线
  • 设计模式-创建型模式-建造者模式
  • 用 Postgres 就好
  • 对于mp4 android可以正常播放 ios和mac safari不能播放问题处理
  • 研究人员利用ChatGPT的强大功能,创建数字病理学AI工具
  • 前端入门:HTML5全攻略
  • Tomcat 优化
  • LWIP相关知识
  • Java常见算法
  • 光储充能源站微电网及其控制综述入门研究笔记
  • 【Qt】输入类控件QDateTimeEdit
  • IO进程(8)
  • pymysql 与 MySQL数据库交互
  • [PHP内核探索]PHP中的哈希表
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 2017-08-04 前端日报
  • Angular 响应式表单之下拉框
  • Java基本数据类型之Number
  • MaxCompute访问TableStore(OTS) 数据
  • mysql 5.6 原生Online DDL解析
  • oldjun 检测网站的经验
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Python进阶细节
  • Python十分钟制作属于你自己的个性logo
  • 程序员该如何有效的找工作?
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 深入浅出Node.js
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​zookeeper集群配置与启动
  • #php的pecl工具#
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (BFS)hdoj2377-Bus Pass
  • (SpringBoot)第七章:SpringBoot日志文件
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (七)Flink Watermark
  • (四)js前端开发中设计模式之工厂方法模式
  • ***详解账号泄露:全球约1亿用户已泄露
  • *算法训练(leetcode)第四十天 | 647. 回文子串、516. 最长回文子序列
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .net core 6 集成和使用 mongodb
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net mvc 获取url中controller和action
  • .Net 垃圾回收机制原理(二)
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .net(C#)中String.Format如何使用
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...