QT学习之读取xml中信息

背景:
我们每次注册后会生成对应的启动码文件,格式如下,启动码最后要在测试工具使用的进行一个验证,验证通过后模块才能使用。所以我希望每次的xml都放在一个文件夹里,等我选择文件夹后,能提取所有xml中的对应信息;

我的XML格式如下,我需要将里的Pid\AId\SId\ACode等都提取出来,放在表格了;

在这里插入图片描述

// 选择xml所在文件夹
void QtWidgetsApplication32::on_selecXmltDir_clicked(){
    m_dirXML = QFileDialog::getExistingDirectory(this, tr("打开XML所在文件夹"), "D:/", QFileDialog::ShowDirsOnly|QFileDialog::DontResolveSymlinks);
    ui.xmlDir->setText("xml文件夹:"+m_dirXML);
}

// 生成excel文件
void QtWidgetsApplication32::on_buildExcelFile_clicked() {
    QDir dir(m_dirXML);
    if (!dir.exists()) {
        qWarning() << "The directory does not exist!";
        return;
    }

    // 文件过滤器,这里设置为获取所有文件和文件夹
    dir.setFilter(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);

    // 将文件和文件夹排序
    dir.setSorting(QDir::Size | QDir::Reversed);

    QString csvName = "ACCode.csv";
    QFile fileCsv(csvName); // 打开csv文件
    if (!fileCsv.open(QIODevice::WriteOnly | QFile::Text))
    {
        outPutMsg(QtDebugMsg, "QtWidgetsApplication32::buildExcelFile invoke end. 打开 1.csv 失败!");
        return;
    }

    QTextStream stream(&fileCsv);
    stream << "PR_PId,PR_AId,PR_SId,PR_ACCode,PR_QueryUrl,PR_OpTime\n"; // 写入

    foreach(QFileInfo fileInfo, dir.entryInfoList()) {
        if (fileInfo.isFile()) {
           // outPutMsg(QtDebugMsg, "file:"+ fileInfo.absoluteFilePath());
            buildExcelFile(fileInfo.absoluteFilePath(), &stream);
        }
        else if (fileInfo.isDir()) {
            outPutMsg(QtDebugMsg, "dir:" + fileInfo.absoluteFilePath());
            // 目录不处理
        }
    }  
    fileCsv.close();
    ui.csvName->setText("csv文件名:"+csvName);
    QMessageBox::information(nullptr, "提示", "生成csv文件成功!");
}

// 生成Excel文件
void QtWidgetsApplication32::buildExcelFile(QString fileNames, QTextStream * pStream) {
    int iRow = 0;
    outPutMsg(QtDebugMsg, "QtWidgetsApplication32::buildExcelFile invoke begin." + fileNames);
    QFile file(fileNames); // 打开xml文件
    if (!file.open(QIODevice::ReadOnly | QFile::Text))
    {
        outPutMsg(QtDebugMsg, "QtWidgetsApplication32::buildExcelFile invoke end. 打开" + fileNames + "失败!");
        return;
    }

    QXmlStreamReader reader(&file);
    QByteArray strACCode;
    while (!reader.atEnd()) {
        QXmlStreamReader::TokenType nType = reader.readNext();
        if (nType == QXmlStreamReader::StartElement) {
            QString tagStr = reader.name().toString();
            qDebug() << reader.name().toString();
            outPutMsg(QtDebugMsg, "tagStr=" + tagStr);
            if (QString::compare(tagStr, QStringLiteral("PR_PId")) == 0){
                QXmlStreamAttributes  Attributes = reader.attributes();
                if (Attributes.hasAttribute("PId")) {
                    // 有属性的是大标签
                    outPutMsg(QtDebugMsg, "PR_PId=" + Attributes.value("PR_PId").toString());
                }
                else { 
                    // 没有属性的是ElementText
                    QString text = reader.readElementText();
                    *pStream << text;
                    *pStream << ",";
                    outPutMsg(QtDebugMsg, "text=" + text);
                }
            }
            else if (QString::compare(tagStr, QStringLiteral("ACCode")) == 0){
            }
            else if(QString::compare(tagStr, QStringLiteral("PR_OpTime")) == 0) {
                QString text = reader.readElementText();
                *pStream << text;
                *pStream << "\n";
                // 最后一个数据 做一个写cvs文件处理
                outPutMsg(QtDebugMsg, "PR_OpTime=" + text);
            }
            else{
                QString text = reader.readElementText();
                *pStream << text;
                *pStream << ",";
                outPutMsg(QtDebugMsg, tagStr+"=" + text);
            }

        }
        else{
            if (reader.isStartDocument()){
                qDebug() << reader.documentVersion().toString();
                qDebug() << reader.documentEncoding().toString();
            }
            if (reader.isComment()) {
            }
        }
    }
    QString filename = QString::fromLatin1(strACCode);
    outPutMsg(QtDebugMsg, filename);
    file.close();
    outPutMsg(QtDebugMsg, "QtWidgetsApplication32::buildExcelFile invoke end.");
}

如上所示,取属性使用QXmlStreamAttributes Attributes = reader.attributes();
取内容使用QString text = reader.readElementText();每次取完就没有了;

我提取的信息是存放在csv文件中的,如下:
QFile fileCsv(csvName); // 打开csv文件
QTextStream stream(&fileCsv);
stream << “PR_PId,PR_AId,PR_SId,PR_ACCode,PR_QueryUrl,PR_OpTime\n”; // 写入
fileCsv.close();

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

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

相关文章

手把手教会西门子PLC代码可视化功能——Prodiag

一、传统的HMI报警方法 在HMI中建立离散量报警&#xff0c;输入报警文本。这种方法的劣势&#xff1a; 1、在PLC程序中需要建立专门报警程序&#xff0c;用于关联HMI中的报警变量 2、需要在HMI文本中输入报警文本 如果程序复杂&#xff0c;报警众多&#xff0c;用这种方法需…

性能监控之prometheus+grafana搭建

前言 Prometheus和Grafana是两个流行的开源工具&#xff0c;用于监控和可视化系统和应用程序的性能指标。它们通常一起使用&#xff0c;提供了强大的监控和数据可视化功能。 Prometheus Prometheus是一种开源的系统监控和警报工具包。它最初由SoundCloud开发&#xff0c;并于…

二分查找法实例

本文是根据数据结构中常常提到的二分法而作的一篇博客&#xff0c;主要通过一个二分法实例进行展开说明&#xff1a; 实例内容 通过一个二分法函数来寻找某个数是否在给定的数组中&#xff1b; 代码展示 # 执行二分查找法的算法函数 # 二分法查找的对象必须是一个有序的集…

尼日利亚光伏储能展

尼日利亚地处热带地区&#xff0c;全年阳光充足&#xff0c;每年日照时间超2600小时(平均每天约7小时)。专家表示&#xff0c;尼日利亚有足够的经济实力和环境条件来开发可再生能源&#xff0c;尤其是太阳能。据世界银行估计&#xff0c;投资太阳能发电厂可为近8000万人提供电力…

短视频交友系统搭建重点,会用到哪些三方服务?

在搭建短视频交友系统时&#xff0c;为了确保系统的稳定性、安全性和用户体验&#xff0c;通常需要用到多种第三方服务。以下是搭建短视频交友系统时可能用到的关键第三方服务&#xff1a; 云服务提供商&#xff1a;如阿里云、腾讯云等&#xff0c;提供稳定、可扩展的服务器资源…

Web前端一套全部清晰 ⑤ day3 列表 表格 表单标签 综合案例

人生是一直向前无法倒退的旅程&#xff0c;所以可以偶尔回头&#xff0c;但一定要往前看 —— 24.4.29 一、综合案例1-体育新闻列表 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport…

优化NGINX性能:使用NGINX_THREADS提高并发处理能力

目录标题 1. 什么是NGINX_THREADS&#xff1f;2. 配置NGINX_THREADS3. 使用NGINX_THREADS处理耗时操作4. 性能调优5. 结论 NGINX作为一个高性能的HTTP和反向代理服务器&#xff0c;在处理高并发请求时表现出色。但随着互联网应用对性能要求的不断提高&#xff0c;深入了解和优化…

AOSP源码开发

AOSP源码开发 Author: cpu_codeDate: 2020-07-11 16:18:27LastEditTime: 2020-07-12 21:08:41FilePath: \note\android_bottom\summary.mdGitee: https://gitee.com/cpu_codeGithub: https://github.com/CPU-CodeCSDN: https://blog.csdn.net/qq_44226094Gitbook: https://923…

【Leetcode每日一题】 综合练习 - 找出所有子集的异或总和再求和(难度⭐)(68)

1. 题目解析 题目链接&#xff1a;1863. 找出所有子集的异或总和再求和 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 算法思路与实现 为了求解给定整数数组的所有子集并将其异或和相加&#xff0c;我们可以采用递…

【GO】命令行解析 os 与 flag

目录 OS解析命令 简单用法 进阶用法 flag命令解析 基础实例 1. 自定义数据类型 2. 创建多个 FlagSet 3. 整合环境变量和配置文件 os与flag 关键点解析 程序的作用 示例命令行调用 在 Go 语言中&#xff0c;命令行解析是一项基本且常用的功能&#xff0c;它允许开发者…

【Linux系统编程】第十一弹---编辑器vim使用

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、vim的基本概念 2、vim的基本操作 3、vim插入模式命令集 4、vim正常(命令)模式命令集 5、vim末行模式命令集 6、vim操作…

C/C++程序设计实验报告综合作业 | 小小计算器

本文整理自博主本科大一《C/C程序设计》专业课的课内实验报告&#xff0c;适合C语言初学者们学习、练习。 编译器&#xff1a;gcc 10.3.0 ---- 注&#xff1a; 1.虽然课程名为C程序设计&#xff0c;但实际上当时校内该课的内容大部分其实都是C语言&#xff0c;C的元素最多可能只…

mac用Homebrew安装MySQL并配置远程登录

1. 简介 MySQL 是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;后被 Oracle 公司收购。MySQL 使用 SQL&#xff08;Structured Query Language&#xff09;作为查询语言&#xff0c;并提供了强大的功能和性能…

鸿蒙开发面试真题——面向对象

鸿蒙开发面向对象的面试题是近年来在软件开发领域中备受关注的话题。作为一种新兴的操作系统&#xff0c;鸿蒙系统的开发者需要具备扎实的面向对象编程知识和丰富的开发经验。在面试中&#xff0c;面试官常常会通过一系列的问题来考察面试者对于鸿蒙开发面向对象的理解和应用能…

ES 深度分页问题及针对不同需求下的解决方案[ES系列] - 第509篇

历史文章&#xff08;文章累计500&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…

春游江淮 请来池州 | 五一池州文旅活动时间表大集合,都在这里

快到五一,想好去哪里玩吗?来池州,各景区缤纷活动登场&#xff0c; 速速划重点、敲黑板! 五一放大招!到底怎么玩?文旅活动、阅读推广 非遗展示......现在都已经为你整理好啦!这份超齐全的 五一假期文旅活动时间表,助力您玩转各景区,整个假期嗨不停~ 旅游惠民活动 表演类活动…

salesforce 如何访问lwc组件

访问lwc有哪些途径呢? Action ButtonTabAura use lwc(拓展)如何区分是新建页面还是编辑页面 Action Button xml文件中要配置tab<?xml version"1.0" encoding"UTF-8"?> <LightningComponentBundle xmlns"http://soap.sforce.com/2006/04/…

使用fitten code插件(vscode),替换通义千问,识别需求中的输入输出

今天我们介绍一个工具,具体介绍可以参考我的这篇文章的介绍,支持vs code 插件,Fitten Code是一款由非十科技开发的AI代码助手,旨在通过大模型驱动来提升编程效率和体验-免费神器-CSDN博客https://blog.csdn.net/lijigang100/article/details/137833223?spm=1001.2014.3001…

MySQL怎么看死锁记录

这个结果分成三部分&#xff1a; (1) TRANSACTION&#xff0c;是第一个事务的信息&#xff1b; (2) TRANSACTION&#xff0c;是第二个事务的信息&#xff1b; (3)WE ROLL BACK TRANSACTION (1)&#xff0c;是最终的处理结果&#xff0c;表示回滚了第一个事务。 第一个事务的信…

文件批量重命名:高效添加前缀顺序编号,让文件整理变得轻松简单

电脑中的文件数量日益增长&#xff0c;如何有效地管理和整理这些文件成为了许多人的难题。你是否曾在大量的文件中迷失&#xff0c;寻找某个特定文件时感到困惑和疲惫&#xff1f;现在&#xff0c;我们为您带来了一款全新的文件改名工具——"一键式文件改名神器"&…