316_C++_xml文件解析成map,可以放到QT表格上, 且 xml、xlsx文件可以互相解析

xml文件例如:

在这里插入图片描述<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <TrTable> <tr id="0" label="TR_PB_CH" text="CH%2"/> <tr id="4" label="TR_PB_CHN" text="Channel"/> <tr id="5" label="TR_PB_WARNING" text="Warning!"/> <tr id="6" label="TR_PB_NOTICE" text="Notice"/> <tr id="7" label="TR_PB_DEFAULT" text="Default"/> <tr id="8" label="TR_PB_SAVE" text="Save"/> <tr id="17" label="TR_PB_CLEAR" text="add-left1"/> <tr id="18" label="TR_PB_ALL" text="add-left2"/> <tr id="19" label="TR_PB_CLEAR-2" text="add-left3"/> <tr id="20" label="TR_PB_ALL-2" text="add-left4"/> <tr id="21" label="TR_PB_ALL-2" text="add-left4"/> <tr id="150524" label="TR_IPC_ACTIVE_PASSWD_MODE2" text="add-left5"/> </TrTable>

xlsx文件例如:

在这里插入图片描述

表格显示效果:

在这里插入图片描述:多个xml文件打开


在这里插入图片描述
:单个xml文件打开

xml文件解析成map:ProcessXMLFilesToMap

-------------------------------.h-------------------------------
#include <vector>
#include <string>
#include <map>
#include <QFileInfo>
#define CREATE_XLSX // 采用xlsx
using namespace std;
struct Translation {string label;vector<string> texts;
};struct TextsInfo {int id;string label;string text;
};
-------------------------------.cpp-------------------------------
std::map<int, Translation> ProcessXMLFilesToMap(std::vector<std::string>& xmlFiles)
{std::map<int, Translation> translations;int num = 0;for (const auto& xmlFile : xmlFiles) {ParseXMLToMap(++num, xmlFile, translations);}return translations; //返回给表格所需的map
}// 解析XML文件并填充translations map
void ParseXMLToMap(int fileNum, const std::string& xmlFilePath, std::map<int, Translation>& translations) 
{QTextCodec *code = QTextCodec::codecForName("GB2312"); //上层,转成中文后,可以解析使用中文路径string selectedFile = code->fromUnicode(xmlFilePath.c_str()).data();std::ifstream file(selectedFile.c_str());if (!file.is_open()) {std::cerr << "Error opening file: " << xmlFilePath << std::endl;return;}std::string line;bool inTrTag = false;std::string currentLabel;std::vector<std::string> currentTexts;int currentId = -1;while (std::getline(file, line)) {if (!line.empty() || line[0] == '<') {if (inTrTag) {if (currentId != -1) {if (translations.find(currentId) != translations.end()) {	// 该ID存在在map中,就进行当前位置的插入translations[currentId].texts.insert(translations[currentId].texts.end(), currentTexts.begin(), currentTexts.end());}else {// 该ID不存在在map中,就进行尾部的插入Translation translation;translation.label = currentLabel;while(translation.texts.size() < (fileNum - 1)){translation.texts.push_back("");}translation.texts.insert(translation.texts.end(), currentTexts.begin(), currentTexts.end());translations[currentId] = translation;}}// 一轮赋值完毕,这些用了暂时保存数据的变量、容器就要clear清空,方便下次继续inTrTag = false;currentLabel.clear();currentTexts.clear();currentId = -1;}// 开始逐行解析size_t trPos = line.find("<tr");if (trPos != std::string::npos) {size_t idPos = line.find("id=\"", trPos);size_t labelPos = line.find("label=\"", trPos);size_t textPos = line.find("text=\"", trPos);if (idPos != std::string::npos && labelPos != std::string::npos && textPos != std::string::npos) {std::string idStr = line.substr(idPos + 4, line.find('"', idPos + 4) - idPos - 4);std::string labelStr = line.substr(labelPos + 7, line.find('"', labelPos + 7) - labelPos - 7);std::string textStr = line.substr(textPos + 6, line.find("/>", textPos + 6) - textPos - 6);while(!textStr.empty() && textStr.back() != '\"')textStr.pop_back();if(!textStr.empty())textStr.pop_back();currentId = std::stoi(idStr);currentLabel = labelStr;currentTexts.push_back(textStr);inTrTag = true;}}}else if (inTrTag) {currentTexts.push_back(line);}}if (inTrTag && currentId != -1) {if (translations.find(currentId) != translations.end()) {	//translations[currentId].texts.push_back(currentTexts);	translations[currentId].texts.insert(translations[currentId].texts.end(), currentTexts.begin(), currentTexts.end());} else {Translation translation;translation.label = currentLabel;while(translation.texts.size() < (fileNum - 1)){translation.texts.push_back("");}translation.texts.insert(translation.texts.end(), currentTexts.begin(), currentTexts.end());translations[currentId] = translation;}}file.close();if(fileNum > 1) // 多个文件,就依照第一个文件的ID作为依据,拼接后续文件的text而已CompleteMissingTexts(fileNum, translations);	
}void CompleteMissingTexts(int fileNum, std::map<int, Translation>& translations)
{for (auto& pair : translations){Translation *translation = &pair.second;while(translation->texts.size() < fileNum){translation->texts.push_back(translation->texts[0]);}}
}

-------------------------------QT表格xml打开操作.h-------------------------------
class xmlFileDoc : public FileDoc // 继承自自写类
{Q_OBJECT
public:explicit xmlFileDoc(QWidget *parent);~xmlFileDoc();void openFile(QString& aFileName); //打开文件void openFiles(std::vector<std::string>& FileNames);void refreshTable(std::map<int, Translation> trans);void closeEvent(QCloseEvent *event);void saveFile();std::vector<TextsInfo> textVectorInfos();
};
-------------------------------QT表格xml打开操作.cpp-------------------------------
void xmlFileDoc::openFiles(std::vector<std::string>& FileNames)
{m_type = MUL_XML_FILE;m_files = FileNames;std::map<int, Translation> trans = ProcessXMLFilesToMap(FileNames);refreshTable(trans);m_customTableWidget->setFileType(false);
}void xmlFileDoc::refreshTable(std::map<int, Translation> trans)
{if (m_files.size() == 0){return;}QSignalBlocker blocker(m_customTableWidget);// 阻塞表格其他地方的信号,例如itemchanged信号m_customTableWidget->setRowCount(trans.size());m_customTableWidget->setColumnCount(m_files.size()+2);m_customTableWidget->setRestrictedColumns(m_files.size()+2);QStringList horizontalHeaderLabels;horizontalHeaderLabels << "ID" << "Label";for (int i = 0; i < m_files.size(); i++){std::string filename = extractFileName(m_files[i]);horizontalHeaderLabels << filename.c_str();}m_customTableWidget->setHorizontalHeaderLabels(horizontalHeaderLabels);int row = 0;for (auto &pair : trans){int col = 0;QTableWidgetItem *item;item = new QTableWidgetItem(QString::number(pair.first));m_customTableWidget->setItem(row,col++,item);item = new QTableWidgetItem(QString::fromStdString(pair.second.label));m_customTableWidget->setItem(row,col++,item);for (int num = col; num < m_files.size()+2; num++){item = new QTableWidgetItem(QString::fromStdString(pair.second.texts[num - 2]));m_customTableWidget->setItem(row,num,item);}row++;}
}void xmlFileDoc::closeEvent(QCloseEvent *event)
{Q_UNUSED(event);
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

空间滤波器和频率域滤波器的对应

说实话&#xff0c;4.7.4的前面的图4.37我没看懂在说什么&#xff0c;但是例4.15这个我倒是看明白了。中心思想是:本来空间滤波器计算的时候需要不停地滑动模版的&#xff0c;这里把滑动用x的值代替了,但是现在不搞滑动了&#xff0c;利用傅里叶变换和卷积公式&#xff0c;只要…

软考 - 系统架构设计师 - 嵌入式真题

问题 1&#xff1a; &#xff08;1&#xff09;.HTML 静态化&#xff1a;可以实现对系统经常访问的页面进行静态化以提高系统访问的效率&#xff0c;但系统页面通常需要数据库中的用户信息和用户选择来动态显示&#xff0c;因此不适合采用。 HTML 静态化&#xff1a; 将动态生成…

二.吊打面试官系列-数据库优化-Explain索引分析

1.如何定位慢SQL 我们知道数据库瓶颈80%都在查询上&#xff0c;数据库优化有一个比较重要的环节就是定位系统中的慢SQL&#xff0c;那么我们如何快速定位到哪些查询语句比较耗时呢&#xff1f;Mysql有自己的慢SQL定位功能 MySQL的慢查询日志&#xff0c;用来记录在MySQL中响应…

项目5-博客系统3+接口完

1.实现显示用户信息 ⽬前⻚⾯的⽤⼾信息部分是写死的. 形如 我们期望这个信息可以随着用户登陆而发生改变. • 如果当前⻚⾯是博客列表⻚, 则显⽰当前登陆⽤⼾的信息. • 如果当前⻚⾯是博客详情⻚, 则显⽰该博客的作者⽤⼾信息. 注意: 当前我们只是实现了显⽰⽤⼾名, 没有…

工厂设备数据采集

在信息化浪潮席卷全球的时代背景下&#xff0c;工厂设备数据采集成为推动企业数字化转型和智能化升级的关键环节。HiWoo Box网关以其卓越的性能和便捷的操作&#xff0c;为工厂设备数据采集提供了强有力的支持。本文将深入探讨工厂设备数据采集的概念&#xff0c;阐述如何利用H…

企业用户管理passwd/sudo工作原理/chage/用户组/切换用户及提权管理/chown知识详谈-6000字

passwd 用户自己给自己设置密码&#xff1a;直接passwd root用户给普通用户设置密码&#xff1a;passwd用户名 stdin 从标准输入获取信息 批量创建用户&#xff1a; bash脚本&#xff1a; for n in {01…10} do useradd wulin$n done n先取01然后循环&#xff0c;再取再执行…

掌握App用户注册情况,Xinstall来帮忙

在移动互联网时代&#xff0c;App已经成为企业与用户之间的重要桥梁。然而&#xff0c;对于许多App开发者来说&#xff0c;如何精准地获取和分析用户注册数据&#xff0c;一直是一个令人头疼的问题。幸运的是&#xff0c;有了Xinstall这样的一站式App全渠道统计服务商&#xff…

java八股文知识点讲解(个人认为讲的比较好的)

1、解决哈希冲突——链地址法&#xff1a;【第7章查找】19哈希表的查找_链地址法解决哈希冲突_哔哩哔哩_bilibili 2、解决哈希冲突——开放地址法 &#xff1a; 【第7章查找】18哈希表的查找_开放定址法解决哈希冲突_哔哩哔哩_bilibili 3、小根堆大根堆的创建&#xff1a;选择…

NL2SQL进阶系列(5):论文解读业界前沿方案(DIN-SQL、C3-SQL、DAIL-SQL、SQL-PaLM)、新一代数据集BIRD-SQL解读

NL2SQL进阶系列(5)&#xff1a;论文解读业界前沿方案&#xff08;DIN-SQL、C3-SQL、DAIL-SQL&#xff09;、新一代数据集BIRD-SQL解读 NL2SQL基础系列(1)&#xff1a;业界顶尖排行榜、权威测评数据集及LLM大模型&#xff08;Spider vs BIRD&#xff09;全面对比优劣分析[Text2…

【C++进阶】详解C++类型转换IO流

C类型转换及IO流 一&#xff0c;C语言的类型转换方式二&#xff0c;C的四种强制类型转换方式2.1 static_cast2.2 reinterpret_cast2.3 const_cast2.4 dynamic_cast 三&#xff0c;C语言的输入和输出四&#xff0c;C的标准IO流五&#xff0c;C文件IO流总结 这一节我们来讲解 C的…

数据结构OJ:设计循环队列

题目介绍 本题为LeetCode上的经典题目&#xff0c;题目要求我们设计一种循环队列&#xff0c;满足FIFO原则且队尾被连接在队首之后。 思路讲解 题目中介绍循环队列的好处是可以重复利用空间&#xff0c;所以我们很容易想到在初始化时即开辟指定大小的空间&#xff0c;之后便不…

策略模式:灵活调整算法的设计精髓

在软件开发中&#xff0c;策略模式是一种行为型设计模式&#xff0c;它允许在运行时选择算法的行为。通过定义一系列算法&#xff0c;并将每个算法封装起来&#xff0c;策略模式使得算法可以互换使用&#xff0c;这使得算法可以独立于使用它们的客户。本文将详细介绍策略模式的…

【每日刷题】Day16

【每日刷题】Day16 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 2. 160. 相交链表 - 力扣&…

基于小程序实现的4s店管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;ssm 【…

【C++11】智能指针

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;理解在C11中智能指针&#xff0c;自己能模拟实现 4 种智能指针 > 毒鸡汤&#xff1a;白日莫闲过&#xff0c;青春不再来。 > 专栏选自&#xff1…

【halcon】C# halcon 内存暴增 续,找到一个解决方案

这里写自定义目录标题 背景释放临时缓存具体的使用感受背景 在之前的文章《【halcon】C# halcon 内存暴增 》中我们提到了一些会导致内存暴增的原因。 其中一个就是使用了计算复杂的算子,且图片很大时,此时内存就会暴增,而且内存无法被释放。 这次,我在做一个项目时,用到…

L2-3 完全二叉树的层序遍历

完全二叉树的层序遍历 一个二叉树&#xff0c;如果每一个层的结点数都达到最大值&#xff0c;则这个二叉树就是完美二叉树。对于深度为 D 的&#xff0c;有 N 个结点的二叉树&#xff0c;若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点&#xff0c;这样的树就是完全…

网络爬虫:定义、应用及法律道德考量

网络爬虫技术在当今数据驱动的世界中发挥着重要作用。本文将从网络爬虫的定义和主要功能&#xff0c;其在业界的应用实例&#xff0c;以及涉及的法律和道德问题三个方面进行深入探讨。 1. 爬虫的定义和主要功能 网络爬虫&#xff0c;也称为网页爬虫或蜘蛛&#xff0c;是一种…

RocketMQ 01 Linux安装

RocketMQ 01 主要内容&#xff1a; 编译安装HelloWorld官网名词 官方网站 http://rocketmq.apache.org GitHub https://github.com/apache/rocketmq Quick Start Linux下使用Maven编译源码安装 Rocketmq4.6需要jdk1.8环境编译和运行 各版本要求 VersionClientBroke…

android不同版本(支持>10)获取当前连接的wifi名称

1、AndroidManifest.xml 配置权限 <uses-permission android:name"android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name"android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name&q…