百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Qt XML流读写XML

bigegpt 2024-09-10 11:19 44 浏览

1. 概述

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

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解析方式已经不推荐使用,强烈建议使用QXmlStreamReader和QXmlStreamWriter代替。

【领QT开发教程学习资料,点击→「链接」←莬费领取,先码住不迷路~】

2. 开发环境

Windows系统:Windows10

Qt版本:Qt5.15或者Qt6

3. 读取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" >

4. 写入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文档。

相关推荐

Go语言泛型-泛型约束与实践(go1.7泛型)

来源:械说在Go语言中,Go泛型-泛型约束与实践部分主要探讨如何定义和使用泛型约束(Constraints),以及如何在实际开发中利用泛型进行更灵活的编程。以下是详细内容:一、什么是泛型约束?**泛型...

golang总结(golang实战教程)

基础部分Go语言有哪些优势?1简单易学:语法简洁,减少了代码的冗余。高效并发:内置强大的goroutine和channel,使并发编程更加高效且易于管理。内存管理:拥有自动垃圾回收机制,减少内...

Go 官宣:新版 Protobuf API(go pro版本)

原文作者:JoeTsai,DamienNeil和HerbieOng原文链接:https://blog.golang.org/a-new-go-api-for-protocol-buffer...

Golang开发的一些注意事项(一)(golang入门项目)

1.channel关闭后读的问题当channel关闭之后再去读取它,虽然不会引发panic,但会直接得到零值,而且ok的值为false。packagemainimport"...

golang 托盘菜单应用及打开系统默认浏览器

之前看到一个应用,用go语言编写,说是某某程序的windows图形化客户端,体验一下发现只是一个托盘,然后托盘菜单的控制面板功能直接打开本地浏览器访问程序启动的webserver网页完成gui相关功...

golang标准库每日一库之 io/ioutil

一、核心函数概览函数作用描述替代方案(Go1.16+)ioutil.ReadFile(filename)一次性读取整个文件内容(返回[]byte)os.ReadFileioutil.WriteFi...

文件类型更改器——GoLang 中的 CLI 工具

我是如何为一项琐碎的工作任务创建一个简单的工具的,你也可以上周我开始玩GoLang,它是一种由Google制作的类C编译语言,非常轻量和快速,事实上它经常在Techempower的基准测...

Go (Golang) 中的 Channels 简介(golang channel长度和容量)

这篇文章重点介绍Channels(通道)在Go中的工作方式,以及如何在代码中使用它们。在Go中,Channels是一种编程结构,它允许我们在代码的不同部分之间移动数据,通常来自不同的goro...

Golang引入泛型:Go将Interface「」替换为“Any”

现在Go将拥有泛型:Go将Interface{}替换为“Any”,这是一个类型别名:typeany=interface{}这会引入了泛型作好准备,实际上,带有泛型的Go1.18Beta...

一文带你看懂Golang最新特性(golang2.0特性)

作者:腾讯PCG代码委员会经过十余年的迭代,Go语言逐渐成为云计算时代主流的编程语言。下到云计算基础设施,上到微服务,越来越多的流行产品使用Go语言编写。可见其影响力已经非常强大。一、Go语言发展历史...

Go 每日一库之 java 转 go 遇到 Apollo?让 agollo 来平滑迁移

以下文章来源于GoOfficialBlog,作者GoOfficialBlogIntroductionagollo是Apollo的Golang客户端Apollo(阿波罗)是携程框架部门研...

Golang使用grpc详解(golang gcc)

gRPC是Google开源的一种高性能、跨语言的远程过程调用(RPC)框架,它使用ProtocolBuffers作为序列化工具,支持多种编程语言,如C++,Java,Python,Go等。gR...

Etcd服务注册与发现封装实现--golang

服务注册register.gopackageregisterimport("fmt""time"etcd3"github.com/cor...

Golang:将日志以Json格式输出到Kafka

在上一篇文章中我实现了一个支持Debug、Info、Error等多个级别的日志库,并将日志写到了磁盘文件中,代码比较简单,适合练手。有兴趣的可以通过这个链接前往:https://github.com/...

如何从 PHP 过渡到 Golang?(php转golang)

我是PHP开发者,转Go两个月了吧,记录一下使用Golang怎么一步步开发新项目。本着有坑填坑,有错改错的宗旨,从零开始,开始学习。因为我司没有专门的Golang大牛,所以我也只能一步步自己去...