00. 目录

文章目录

  • 00. 目录
  • 01. 概述
  • 02. 开发环境
  • 03. 读取XML文档
  • 04. 写入XML文档
  • 05. 预留
  • 06. 附录

01. 概述

从Qt 4.3开始引入了两个新的类来读取和写入XML文档: QXmlStreamReaderQXmlStreamWriter

QXmlStreamReader类提供了一个快速的解析器,通过一个简单的流API来读取格式良好的XML文档,它是作为Qt的SAX解析器的替代品的身份出现的,因为它比SAX解析器更快更方便。流读取器的基本原理就是将XML文档报告为一个记号(tokens)流,应用程序代码自身来驱动循环,在需要的时候可以从读取器中一个接一个的拉出记号。这个是通过调用readNext()函数实现的,它可以读取下一个记号,然后返回一个记号类型,它由QXmlStreamReader::TokenType定义,其所有取值如表所列。然后可以使用isStartElement()和text()等函数来判断这个记号是否包含需要的信息。

与QXmlStreamReader对应的是QXmlStreamWriter,它通过一个简单的流API提供了一个XML写入器。QXmlStreamWriter的使用也是十分简单的,只需要调用相应的记号的写入函数来写入相关数据即可。

XML流包含两个部分QXmlStreamReader和和QXmlStreamWriter。 QXmlStream Reader 类提供了一个快速的解析器.它通过一个简单的流API 来读取格式良好的XML 文挡,它是作为Qt 的SAX 解析器的替代品身份出现的,因为它比SAX 解析器更快更方便。

在SAX 中,应用程序必须提供处理器(回调函数)来从解析器获得所谓的XML 事件;而QXmlStreamReader是应用程序代码向身来驱动循环,在需要的时候可以从读取器中一个接一个地拉出记号。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tauu8Hp2-1616769486826)(assets/image-20210326220914076.png)]

温馨提示

在Qt6中,SAX解析方式已经不推荐使用,强烈建议使用QXmlStreamReaderQXmlStreamWriter代替。

02. 开发环境

Windows系统:Windows10

Qt版本:Qt5.15或者Qt6

03. 读取XML文档

3.1 新建Qt控制台应用QtConsole Application,项目名称为18XML,完成后将18XML.pro文件的第一行代码更改为:

QT += xml

3.2 在main.cpp文件,将内容更改如下:

#include <QCoreApplication>#include <QFile>
#include <QXmlStreamReader>
#include <QXmlStreamWriter>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QFile file("../18XML/test.xml");if (!file.open(QFile::ReadOnly | QFile::Text)){qDebug() << "Error: 打开文件失败";return 1;}QXmlStreamReader reader;//设置文件 将流设置为初始状态reader.setDevice(&file);//如果没有读到文档结尾 而且没有出现错误while(!reader.atEnd()){//读取下一个记号 它返回记号的类型QXmlStreamReader::TokenType type = reader.readNext();//下面根据记号的类型来进行不同的输出if (type == QXmlStreamReader::StartDocument){qDebug() << reader.documentEncoding() << reader.documentVersion();}if (type == QXmlStreamReader::StartElement){qDebug() << "<" << reader.name() << ">";if (reader.attributes().hasAttribute("id")){qDebug() << reader.attributes().value("id");}}if (type == QXmlStreamReader::EndElement){qDebug() << "</" << reader.name() << ">";}if (type == QXmlStreamReader::Characters && !reader.isWhitespace()){qDebug() << reader.text();}}//如果读取中出现了错误 就输出错误信息if (reader.hasError()){qDebug() << "error: " << reader.errorString();}file.close();return a.exec();
}

可以看到流读取器就是在一个循环中通过使用readNext()来不断读取记号的,这里可以对不同的记号和不同的内容进行不同的处理,既可以在本函数中进行,也可以在其他函数或者其他类中进行。运行程序,查看效果。

"UTF-8" "1.0"
< "library" >
< "book" >
"01"
< "title" >
"Qt"
</ "title" >
< "author" >
"LiMing"
</ "author" >
</ "book" >
< "book" >
"02"
< "title" >
"Linux"
</ "title" >
< "author" >
"ZhengGang"
</ "author" >
</ "book" >
</ "library" >

04. 写入XML文档

与QXmlStreamReader对应的是QXmlStreamWriter,它通过一个简单的流API提供了一个XML 写人器。QXmlStreamWriter的使用也十分简单,只需要调用相应记号的写入函数来写入相关数据即可。

#include <QCoreApplication>#include <QFile>
#include <QXmlStreamReader>
#include <QXmlStreamWriter>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QFile file("../18XML/test2.xml");if (!file.open(QFile::WriteOnly | QFile::Text)){qDebug() << "Error: 打开文件失败";return 1;}QXmlStreamWriter writer(&file);writer.setAutoFormatting(true);writer.writeStartDocument();writer.writeStartElement("bookmark");writer.writeAttribute("href", "http://www.qt.io");writer.writeTextElement("title", "Qt Home");writer.writeEndElement();writer.writeEndDocument();//关闭文件file.close();qDebug() << "Write Finished";return a.exec();
}

执行结果 test2.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<bookmark href="http://www.qt.io">
<title>Qt Home</title>
</bookmark>

这里使用了setAutoFormatting(true)函数来自动设置格式,这样会自动换行和添加缩进。然后使用了writeStartDocument(),该函数会自动添加首行的XML说明(即),添加元素可以使用writeStartElement(),不过,这里要注意,一定要在元素的属性、文本等添加完成后,使用writeTextElement()来关闭前一个打开的元素。在最后使用writeEndDocument()来完成文档的写入。现在大家可以运行程序了,这时会在项目目录中生成一个XML文档。

05. 预留

06. 附录

6.1 Qt教程汇总
网址:https://dengjin.blog.csdn.net/article/details/115174639

6.2 源码下载
网址:【Qt】 XML流读写XML.rar

【Qt】 XML流读写XML相关推荐

  1. [Qt教程] 第30篇 XML(四)使用流读写XML

    [Qt教程] 第30篇 XML(四)使用流读写XML 楼主  发表于 2013-5-22 13:03:33 | 查看: 611| 回复: 0 使用流读写XML 版权声明 该文章原创于作者yafeili ...

  2. Qt DOM读写XML文件

    QXmlStreamReader:一种快速的基于流的方式访问良格式 XML 文档,特别适合于实现一次解析器(所谓"一次解析器",可以理解成我们只需读取文档一次,然后像一个遍历器从头 ...

  3. 一文搞定Qt读写excel以及qt读写xml数据

    一文搞定Qt读写excel以及qt读写xml数据 最终的实现效果图 RC_ICONS = logo.ico .pro文件同级目录下加入 logo.ico 图标文件,运行文件,文件的图标就被写入软件 u ...

  4. java基础 day12-FileInputStream类,文件的复制,缓冲流,Propertes文件,xml文件读写,网络socket编程(构建TCP客户端),内部类

    FileInputStream类的其他常用方法() /**在project下新建temp文件,内容为abcdef*FileInputStream类的其他常用方法:* int available():返 ...

  5. [QT操作XML]QT读写XML文件,QT修改XML文件

    [QT操作XML]QT读写XML文件 XML简介 QT操作XML,写入.读取.修改 XML效果演示 XML简介 概念:Extensible Markup Language 可扩展标记语言(可扩展:标签 ...

  6. QT之xml文件读写

    思路 将指定路径下的xml文件读取到列表中 插入和删除按钮仅完成界面上的插入,不对xml文件进行操作 保存按钮,清空xml文件,并遍历界面列表中的数据存入xml文件 1. pro文件中引入xml库 # ...

  7. 【Qt】DOM读取XML文档

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. XML文档示例 04. DOM读取XML文档内容 05. 预留 06. 附录 01. 概述 DOM(Document Ob ...

  8. PHP怎么读写XML?(四种方法)

    PHP怎么读写XML?(四种方法) 一.总结 1.这四种方法中,字符串的方式是最原始的方法.SimpleXML和DOM扩展是属于基于树的解析器,把整个文档存储为树的数据结构中,需要把整个文档都加载到内 ...

  9. python使用minidom读写xml

    1. xml简介 xml解析方法有两种标准: SAX和DOM. 1.1 SAX SAX(Simple API for XML)是基于事件处理的,当XML文档顺序读入时,每次遇到一个元素都会触发相应的事 ...

最新文章

  1. 运维经验分享(六)-- 深究crontab不能正确执行Shell脚本的问题(二)
  2. Android服务一 创建启动服务
  3. 事务RFC(TRFC)原理和实战解析
  4. ArcGIS实验教程——实验三十五:ArcGIS Model Builder与空间建模原理、案例详解
  5. [剑指offer][JAVA][第62题][约瑟夫环][LinkedList vs ArrayList]
  6. 异常来自 hresult:0x800a03ec_肺癌早期不是悄无声息,一旦出现这3个“异常”,十有八九是肺癌...
  7. [Ext JS 7]7.2 事件(Event)
  8. 国标 计算机机房,国标相关知识:电子信息系统机房设计规范(GB50174-2008)
  9. 微波工程(2)——传输线理论
  10. 单片机实验一、单片机开发环境设置
  11. TPU 使用TPU训练tensorflow初探(Colab)
  12. matlab病毒模拟传播
  13. 苹果手机速度慢_安卓日语App,苹果也看进来
  14. 桌面多了一个计算机,Win10虚拟桌面:一台电脑多个桌面
  15. 2022年系统架构设计师考试大纲
  16. linux上使用drive从google drive 下载文件和文件夹
  17. JAVA 消息队列的使用场景
  18. ipoo3可以用鸿蒙,真正全网通!iQOO 3支持双模六频5G,出国也能用
  19. android记账本登录界面,Android记账本开发(一):整体UI界面布局
  20. Ubuntu设置全局socks代理

热门文章

  1. 如何从完整的文件路径中分离文件名和路径名?
  2. python调用zabbixapi接口_python3 + zabbix api 的使用
  3. Java黑皮书课后题第7章:7.26(完全相同的数组)如果两个数组list1和list2的对应元素都相等,认为完全相同。编写一个测试程序,提示用户输入两个整数列表,然后显示这两个列表是否完全相同
  4. C语言学习之编程实现:输入长方形的两个边长a, b和一个整数k。k=1时,输出长方形的周长 l; k=2时 ,输出长方形的面积s;当k=3时 , 输出长方形的周长1和面积s
  5. django orm 操作符
  6. 1 python基础
  7. Linux┊详解udev
  8. 《Go语言实战》摘录:6.5 并发 - 通道
  9. Node.js项目目录介绍
  10. 如何评审功能测试用例?