QT 使用QXmlStreamReader/QXmlStreamWriter和QDomDocument俩种方式读写XML文件

文章目录

    • 效果图
    • 使用`QDomElement`读写
      • 读取 XML 文档
      • 创建或修改 XML 文档
    • 使用`QXmlStreamReader`和`QXmlStreamWriter`读写
      • QXmlStreamReader
      • QXmlStreamWriter
    • 俩种方式的优缺点
      • QXmlStreamReader/QXmlStreamWriter
      • QDomDocument
      • 选择建议
    • 总结

效果图

在这里插入图片描述

  • 我们可以直接将控件或其他配置的值写到xml文件中,这样下一次打开时,直接读取xml中的值进行初始化窗口。

使用QDomElement读写

QDomDocument 是 Qt 框架中用于处理 XML 的类,它提供了一个以 DOM(文档对象模型)方式解析和创建 XML 文档的接口。DOM 是 W3C 推荐的处理 XML 的标准编程接口,它将 XML 文档转换为一个树形结构,可以对其进行遍历和修改。
以下是使用 QDomDocument 读写 XML 的基本步骤:

读取 XML 文档

  1. 创建 QDomDocument 对象
    QDomDocument doc;
    
  2. 加载 XML 文档
    有几种方式可以加载 XML 文档,比如从文件、字符串等:
    QFile file("example.xml");
    if (!file.open(QIODevice::ReadOnly))
        return;
    if (!doc.setContent(&file)) {
        file.close();
        return;
    }
    file.close();
    
  3. 访问文档元素
    加载完成后,可以访问根元素,然后遍历或查询其他元素:
    QDomElement root = doc.documentElement();
    QDomNode child = root.firstChild();
    while(!child.isNull()) {
        QDomElement element = child.toElement();
        if(!element.isNull()) {
            // 处理元素
        }
        child = child.nextSibling();
    }
    
  4. 读取元素数据
    可以读取元素的属性和文本内容:
    QString text = element.text();
    QString attribute = element.attribute("attributeName");
    

创建或修改 XML 文档

  1. 创建 QDomDocument 对象
    如果是从头创建 XML,首先创建一个空的 QDomDocument 对象。
  2. 创建和设置根元素
    QDomElement root = doc.createElement("rootElement");
    doc.appendChild(root);
    
  3. 添加子元素和属性
    QDomElement child = doc.createElement("childElement");
    root.appendChild(child);
    QDomText text = doc.createTextNode("Some text");
    child.appendChild(text);
    child.setAttribute("attributeName", "attributeValue");
    
  4. 保存 XML 文档
    可以将 QDomDocument 对象的内容保存到文件或字符串:
    QFile file("output.xml");
    if (!file.open(QIODevice::WriteOnly))
        return;
    QTextStream out(&file);
    doc.save(out, 4);  // 参数 4 表示缩进为 4 个空格
    file.close();
    

在使用 QDomDocument 时,需要注意错误处理和异常安全。例如,在尝试打开文件或解析 XML 时,应该检查可能出现的错误,并做出相应的处理。
以上是 QDomDocument 的基本使用方法。在实际应用中,可能还需要更复杂的操作,比如 XPath 查询、处理命名空间等。Qt 提供了丰富的 API 来支持这些高级功能。
QXmlStreamReaderQXmlStreamWriter 是 Qt 框架中用于处理 XML 文档的类。它们提供了一种快速、只读的 API 来解析 XML,以及一个用于写入 XML 文档的 API。这两个类都是基于流(Stream)的,这意味着它们可以处理大型的 XML 文档,而不需要将整个文档加载到内存中。

使用QXmlStreamReaderQXmlStreamWriter读写

QXmlStreamReader

QXmlStreamReader 用于读取和解析 XML 文档。它逐个读取 XML 元素、属性和字符数据,并将其转换为不同的类型,如StartElement、EndElement、Characters等。使用 QXmlStreamReader 可以轻松地遍历 XML 文档并提取所需的信息。
以下是使用 QXmlStreamReader 读取 XML 文档的一个简单示例:

#include <QXmlStreamReader>
#include <QDebug>
void readXML(const QString &xmlData) {
    QXmlStreamReader xml(xmlData);
    while (!xml.atEnd() && !xml.hasError()) {
        QXmlStreamReader::TokenType token = xml.readNext();
        switch (token) {
        case QXmlStreamReader::StartElement:
            qDebug() << "StartElement:" << xml.name();
            break;
        case QXmlStreamReader::EndElement:
            qDebug() << "EndElement:" << xml.name();
            break;
        case QXmlStreamReader::Characters:
            if (!xml.isWhitespace())
                qDebug() << "Characters:" << xml.text();
            break;
        default:
            break;
        }
    }
    if (xml.hasError()) {
        qDebug() << "Error:" << xml.errorString();
    }
}

QXmlStreamWriter

QXmlStreamWriter 用于写入 XML 文档。它提供了一个简单的 API 来创建 XML 元素、属性和字符数据。使用 QXmlStreamWriter 可以轻松地生成格式良好的 XML 文档。
以下是使用 QXmlStreamWriter 写入 XML 文档的一个简单示例:

#include <QXmlStreamWriter>
#include <QDebug>
#include <QTextStream>
void writeXML() {
    QString xmlData;
    QTextStream out(&xmlData);
    QXmlStreamWriter xmlWriter(out);
    xmlWriter.setAutoFormatting(true); // 使输出格式化
    xmlWriter.writeStartDocument();
    xmlWriter.writeStartElement("library");
    xmlWriter.writeStartElement("book");
    xmlWriter.writeAttribute("category", "Mystery");
    xmlWriter.writeTextElement("title", "The Da Vinci Code");
    xmlWriter.writeTextElement("author", "Dan Brown");
    xmlWriter.writeEndElement(); // book
    xmlWriter.writeEndElement(); // library
    xmlWriter.writeEndDocument();
    qDebug() << xmlData;
}

这两个类使得在 Qt 应用程序中处理 XML 数据变得非常简单。通过使用它们,可以轻松地解析和生成 XML 文档,而无需担心底层的 XML 解析细节。

俩种方式的优缺点

QXmlStreamReader/QXmlStreamWriterQDomDocument 是 Qt 中处理 XML 的两种不同的方式,每种方式都有其优缺点,适用于不同的场景。

QXmlStreamReader/QXmlStreamWriter

  • 基于流:这两个类是基于流的,意味着它们逐个处理 XML 文档的元素,而不需要将整个文档加载到内存中。这使得它们在处理大型 XML 文档时非常高效。
  • 只读或只写QXmlStreamReader 是只读的,而 QXmlStreamWriter 是只写的。
  • 轻量级:这两个类比 QDomDocument 更轻量级,因为它们不会创建一个完整的文档对象模型(DOM)。
  • 易于遍历QXmlStreamReader 使得遍历 XML 文档变得非常简单,因为你只需要调用 readNext() 直到文档结束。
  • 快速:由于它们不需要构建整个文档的内存表示,因此在解析速度上通常比 QDomDocument 快。

QDomDocument

  • 文档对象模型(DOM)QDomDocument 是一个实现了 DOM 的类,它将整个 XML 文档加载到内存中,并以树状结构表示。
  • 读写QDomDocument 同时支持读取和修改 XML 文档。
  • 易于修改:由于 QDomDocument 在内存中维护了整个文档的树状结构,因此它非常适合需要频繁修改文档内容的场景。
  • API 丰富QDomDocument 提供了丰富的 API 来操作文档,包括查询、修改和删除元素和属性。

选择建议

  • 如果你的应用程序需要遍历大型 XML 文档,或者只需要进行只读或只写的操作,那么 QXmlStreamReader/QXmlStreamWriter 可能是更好的选择,因为它们更高效且资源消耗更少。
  • 如果你的应用程序需要频繁地修改 XML 文档,或者需要随机访问文档中的元素,那么 QDomDocument 可能更适合,因为它提供了更灵活的 API 来操作文档。

总结

  • 知识理应共享,源码在此。
  • 这俩个类使用起来还是很简单的,看个示例下来一般就会的差不多了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/512138.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

html引入json文本测试数据

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 复现bug时&#xff0c;可以这样给前端准备测试数据。 dayData.json存放测试数据&#xff0c;只需声明为变量即可 这里不用管ide中的报错。 <!DOCTYPE html> <html lang"en">…

一个对我触动很深的生活理念

经常有读者对我的写作过程感到好奇&#xff0c;会问&#xff1a;你是用什么工具来写作的呢&#xff1f;在他们的想象中&#xff0c;可能觉得我有一套非常复杂的知识管理和写作流程&#xff0c;能够快速地组织和安排材料&#xff0c;从而让写作变得非常轻松。 其实不是的。有一段…

VScode-配置文件

导入配置文件 ShiftCtrlp 输入&#xff1a; import 选择文件 点击确认 导出配置文件 设置选择导出 确认导出 保存为本地文件 保存文件

Linux_进程的优先级环境变量上下文切换

文章目录 一、进程的优先级二、进程的四个重要概念三、上下文切换四、环境变量4.1 查看当前shell环境下的环境变量与内容 一、进程的优先级 什么是优先级&#xff1f; 指定一个进程获取某种资源的先后顺序本质是进程获取cpu资源的优先顺序 为什么要有优先级 进程访问的资源&am…

矩阵空间秩1矩阵小世界图

文章目录 1. 矩阵空间2. 微分方程3. 秩为1的矩阵4. 图 1. 矩阵空间 我们以3X3的矩阵空间 M 为例来说明相关情况。目前矩阵空间M中只关心两类计算&#xff0c;矩阵加法和矩阵数乘。 对称矩阵-子空间-有6个3X3的对称矩阵&#xff0c;所以为6维矩阵空间上三角矩阵-子空间-有6个3…

mysql 基本查询

学习了mysql函数&#xff0c;接下来学习mysql基本查询。 1&#xff0c;基本查询语句 MySQL从数据表中查询数据的基本语句为SELECT 语句。SELECT语句的基本格式是&#xff1a; SELECT (*I <字段列表>} FROM <表1>,<表2>..[WHERE<表达式> [GROUP BY <…

VUE——概述

vue是前端框架&#xff0c;基于MVVM思想。 引入 从官网下载vue文件 <script src"js/vue.js"></script> 定义vue对象 new Vue({el: "#x",//vue接管区域&#xff0c;#表示选择器&#xff0c;x是id名字data: {message: "y"} })案例…

宁波ISO45001认证费用

宁波ISO45001认证费用&#x1fae0;是许多企业在考虑&#x1f914;引入国际职业健康安全管理体系时&#x1f566;所关心的一个⁉️重要问题。ISO45001是一个&#x1f30f;全球性的标准&#xff0c;旨在帮助&#x1f3ef;组织建立并维护一个&#x1f388;有效的职业健康安全⭐️…

Flask学习(五):session相关流程

流程图如下图所示&#xff1a; 调用相关类如下图所示&#xff1a; 相关代码如下&#xff1a; from flask import Flask, sessionapp Flask(__name__)1. 加密会话数据&#xff1a;在 Flask 中&#xff0c;会话数据存储在客户端的 cookie 中。设置 app.secret_key 可以加密会话…

Java毕业设计-基于springboot开发的HTML问卷调查系统设计与实现-毕业论文(附毕设源代码)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、管理员功能模块的实现1.1 问卷列表1.2 新闻资讯信息管理1.3 新闻资讯类型管理 四、毕设内容和源代码获取总结 Java毕业设计-基于…

应用方案D78040场扫描电路,偏转电流可达1.7Ap-p,可用于中小型显示器

D78040是一款场扫描电路&#xff0c;偏转电流可达1.7Ap-p&#xff0c;可用于中小型显示器。 二 特 点 1、有内置泵电源 2、垂直输出电路 3、热保护电路 4、偏转电流可达1.7Ap-p 三 基本参数 四 应用电路图 1、应用线路 2、PIN5脚输出波形如下&#xff1a;

springdoc-openapi-用户界面如何将请求设置为HTTPS

一、问题描述 当我们的服务接口需要通过HTTPS访问时&#xff0c;通过swagger可视化页面请求接口的时候&#xff0c;发起的是HTTP请求&#xff0c;导致请求无法到达后端&#xff0c;影响测试。 二、解决方法 1、将服务的地址添加到配置文件中 swagger:server-list: #本地环境…

【Vue3源码学习】— CH2.8 Vue 3 响应式系统小结

Vue 3 响应式系统小结 1.核心概念1.1 Proxy和Reflect1.2 响应式API1.3 依赖收集与更新触发1.4 触发更新&#xff08;Triggering Updates&#xff09;&#xff1a;1.5 副作用函数&#xff08;Effect&#xff09;1.6 计算属性和观察者1.7 EffectScope1.8 性能优化&#xff1a; 2.…

数据库-root密码丢失的重置方案(win11环境)

当在windows系统中安装的mysql由于操作不当&#xff0c;或者密码遗忘&#xff0c;今天测试了一下&#xff0c;可以用以下方法重置root的密码。 mysqlwindows环境root密码重置问题 在win10/11环境下mysql8密码遗忘后的重置密码方案。 停止mysql服务 查找windows中的mysql服务名称…

软考高级架构师:性能评价方法概念和例题

一、AI 讲解 性能评价是衡量计算机系统或其组件在指定条件下执行预期任务的有效性的一种方式。性能评价的方法主要可以分为几种&#xff0c;每种方法都有其特点和适用场景。 性能评价方法 方法描述时钟频率法通过计算机的时钟频率来评估性能&#xff0c;时钟频率越高&#x…

morkdown语法转微信公众号排版(免费)

morkdown语法转微信公众号排版&#xff08;免费&#xff09; 源码来自githab&#xff0c;有些简单的问题我都修复了。大家可以直接去找原作者的源码&#xff0c;如果githab打不开就从我下载的网盘里下载吧。 效果

LeetCode 热题 100 | 动态规划(一)

目录 1 70. 爬楼梯 1.1 基本思路 1.2 官方题解 2 118. 杨辉三角 3 198. 打家劫舍 菜鸟做题&#xff0c;语言是 C 1 70. 爬楼梯 核心思想&#xff1a;把总问题拆解为若干子问题。 总问题&#xff1a;上到 5 楼的方式有多少种子问题&#xff1a;上到 4 楼的方式有多…

焦虑研究的实验设备——大小鼠高架十字迷宫KT-0856

高架十字迷宫是一种广泛应用于焦虑研究的实验设备&#xff0c;尤其适用于啮齿类动物如大鼠和小鼠。这种迷宫的设计基于啮齿类动物的自然探究行为&#xff0c;以及它们对于高悬敞开环境的恐惧。通过观察和量化动物在开臂和闭臂之间的行为选择&#xff0c;研究人员可以评估其焦虑…

逻辑回归(Logistic Regression)详解

逻辑回归&#xff08;Logistic Regression&#xff09;是一种常用的统计学习方法&#xff0c;用于解决二分类问题。虽然名字中包含“回归”&#xff0c;但逻辑回归实际上是一种分类算法&#xff0c;而不是回归算法。它的基本原理是使用逻辑函数&#xff08;也称为Sigmoid函数&a…

mysyl索引

图中一共分了三个部分&#xff1a; Index Key &#xff1a;MySQL是用来确定扫描的数据范围&#xff0c;实际就是可以利用到的MySQL索引部分&#xff0c;体现在Key Length。 Index Filter&#xff1a;MySQL用来确定哪些数据是可以用索引去过滤&#xff0c;在启用ICP后&#xff…