qt_c++_xml存这种复杂类型

demo,迅雷链接。或者我主页上传的资源
链接:https://pan.xunlei.com/s/VO8bIvYFfhmcrwF-7wmcPW1SA1?pwd=nrp4#
复制这段内容后打开手机迅雷App,查看更方便
在这里插入图片描述

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>#include <QTextCodec>
#include <QFile>
#include <QDomDocument>
#include <QTextStream>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEtypedef struct
{QString num_name;QString subFcParaName;double workMin;double workMax;}attachedCondition;class ConditionClass
{
public:ConditionClass(){};~ConditionClass(){};QString fcParaName;double earlyMin;double earlyMax;double alarmMin;double alarmMax;QList<attachedCondition>attached_contidition_;};class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void removeNode(QString xml_path,QString node_name);void updateNode(QString xml_path,QList<ConditionClass>all_condition_);void loadXml(QString xml_path);void createXML(QString filePath);QDomElement createAttributrNode(QDomDocument &doc,QString attribute_value,QString node_name);QDomElement createNode(QDomDocument &doc,QString value,QString node_name);QDomElement createNode(QDomDocument &doc,double value,QString node_name);void appendXml(QDomDocument &doc,QDomElement &root,QList<ConditionClass>all_condition_);//这是要存进去的数据QList<ConditionClass>all_condition_;//这是要读取出来的数据QList<ConditionClass>read_all_data_;private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);ConditionClass it;it.fcParaName="油压";it.earlyMin=55;it.earlyMax=66;it.alarmMax=88;it.alarmMin=77;attachedCondition at;at.num_name="附属1";at.subFcParaName="高度表";at.workMin=5;at.workMax=6;it.attached_contidition_.append(at);attachedCondition at0;at0.num_name="附属2";at0.subFcParaName="液压油温度";at0.workMin=5;at0.workMax=6;it.attached_contidition_.append(at0);ConditionClass it0;it0.fcParaName="1发N1";it0.earlyMin=55;it0.earlyMax=66;it0.alarmMax=88;it0.alarmMin=77;attachedCondition at00;at00.num_name="附属1";at00.subFcParaName="机油温度";at00.workMin=5;at00.workMax=6;it0.attached_contidition_.append(at00);all_condition_.append(it);all_condition_.append(it0);QString path= "C:/Users/36075/Desktop/ycn_xml/xml_ycn/warnRuler.xml";createXML(path);removeNode(path,"1发N1");removeNode(path,"油压");updateNode( path,all_condition_);loadXml(path);}MainWindow::~MainWindow()
{delete ui;
}/*** @brief 创建一个xml文档* @param 路径* @param 基本参数*/
void MainWindow::createXML(QString filePath)
{QFile file(filePath);bool isOk = file.open(QIODevice::ReadWrite);if(file.size()!=0){return;}QDomDocument doc;QDomProcessingInstruction instruction;instruction=doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");doc.appendChild(instruction);QDomElement root = doc.createElement("root");doc.appendChild(root);appendXml(doc,root,this->all_condition_);//   appendXml(doc,root,this->all_condition_);QTextStream stream(&file);stream.setCodec("UTF_8");doc.save(stream,4,QDomNode::EncodingFromTextStream);file.close();}void MainWindow::loadXml(QString xml_path)
{QFile file(xml_path);if(!file.open(QFile::ReadOnly | QFile::Text)){return;}QString strError;int errorLine;int errorColumn;QDomDocument doc;if(!doc.setContent(&file, false, &strError, &errorLine, &errorColumn)){return;}QDomElement root = doc.documentElement();if(root.tagName() == "root"){QDomNode first = root.firstChild();while(!first.isNull()){ConditionClass cc;if(first.toElement().tagName() == "主参数"){QString str = first.toElement().attribute("主参数");qDebug()<<str;cc.fcParaName=str;QDomNode node = first.firstChild();while(!node.isNull()){if(node.toElement().tagName() == "earlyMin"){QString earlyMin = node.toElement().text();qDebug()<<earlyMin;cc.earlyMin=earlyMin.toDouble();}if(node.toElement().tagName() == "earlyMax"){QString earlyMax = node.toElement().text();qDebug()<<earlyMax;cc.earlyMax=earlyMax.toDouble();}if(node.toElement().tagName() == "alarmMax"){QString alarmMax = node.toElement().text();qDebug()<<alarmMax;cc.alarmMax=alarmMax.toDouble();}if(node.toElement().tagName() == "alarmMin"){QString alarmMin = node.toElement().text();qDebug()<<alarmMin;cc.alarmMin=alarmMin.toDouble();}if(node.toElement().tagName() == "附属"){//访问附属下面的子节点QString attri = node.toElement().attribute("附属");qDebug()<<attri;QDomNode attrinode = node.firstChild();while(!attrinode.isNull()){attachedCondition atc;//附属1里面的子节点内容访问一下qDebug()<<attrinode.toElement().tagName();atc.num_name=attrinode.toElement().tagName();QDomNode attrinode1 = attrinode.firstChild();while(!attrinode1.isNull()){if(attrinode1.toElement().tagName() == "参数名"){QString diany = attrinode1.toElement().text();qDebug()<<diany;atc.subFcParaName=diany;}if(attrinode1.toElement().tagName() == "workMin"){QString diany = attrinode1.toElement().text();qDebug()<<diany;atc.workMin=diany.toDouble();}if(attrinode1.toElement().tagName() == "workMax"){QString diany = attrinode1.toElement().text();qDebug()<<diany;atc.workMax=diany.toDouble();}attrinode1=attrinode1.nextSibling();}cc.attached_contidition_.append(atc);attrinode = attrinode.nextSibling();}}node = node.nextSibling();}}this->read_all_data_.append(cc);first = first.nextSibling();}}file.close();}/*** @brief 打开路径下的xml文档,删除指定名称的节点* @param 路径* @param 基本参数*/
void MainWindow::removeNode(QString xml_path,QString node_name)
{QFile file(xml_path);if(!file.open(QFile::ReadOnly|QFile::WriteOnly | QFile::Text)){return;}QString strError;int errorLine;int errorColumn;QDomDocument doc;if(!doc.setContent(&file, false, &strError, &errorLine, &errorColumn)){return;}file.close();QDomElement root = doc.documentElement();if(root.tagName() == "root"){QDomNode first = root.firstChild();while(!first.isNull()){if(first.toElement().attribute("主参数") ==node_name){root.removeChild(first);//  break;}first = first.nextSibling();}}if(!file.open(QFile::WriteOnly|QFile::Truncate))return;QTextStream out_stream(&file);doc.save(out_stream,4); //缩进4格file.close();}/*** @brief 打开xml文档,然后往里面写数据* @param* @param*/
void MainWindow::updateNode(QString xml_path,QList<ConditionClass>all_condition_)
{QFile file(xml_path); //相对路径、绝对路径、资源路径都可以if(!file.open(QFile::ReadOnly))return;//增加一个一级子节点以及元素QDomDocument doc;if(!doc.setContent(&file)){file.close();return;}file.close();QDomElement root=doc.documentElement();if(all_condition_.isEmpty()){return;}for(auto it:all_condition_){auto fcParaName=it.fcParaName;auto earlyMin= it.earlyMin;auto earlyMax=  it.earlyMax;auto alarmMax=  it.alarmMax;auto alarmMin=  it.alarmMin;auto main_para= createAttributrNode(doc,fcParaName,"主参数");root.appendChild(main_para);main_para.appendChild(createNode(doc,earlyMin,"earlyMin"));main_para.appendChild(createNode(doc,earlyMax,"earlyMax"));main_para.appendChild(createNode(doc,alarmMax,"alarmMax"));main_para.appendChild(createNode(doc,alarmMin,"alarmMin"));if(!it.attached_contidition_.isEmpty()){auto attribute_para=createAttributrNode(doc,"附属","附属");main_para.appendChild(attribute_para);for(auto item:it.attached_contidition_){int i=0;//QString attribute_para=tr("附属")+QString::number(i);QString num_name=item.num_name;QString subFcParaName=item.subFcParaName;double workMin=item.workMin;double workMax=item.workMax;auto at= createAttributrNode(doc,num_name,num_name);at.appendChild(createNode(doc,subFcParaName,"参数名"));at.appendChild(createNode(doc,workMin,"workMin"));at.appendChild(createNode(doc,workMax,"workMax"));attribute_para.appendChild(at);i++;}}}if(!file.open(QFile::WriteOnly|QFile::Truncate))return;QTextStream out_stream(&file);doc.save(out_stream,4); //缩进4格file.close();}void MainWindow::appendXml(QDomDocument &doc,QDomElement &root,QList<ConditionClass>all_condition_)
{for(auto it:all_condition_){auto fcParaName=it.fcParaName;auto earlyMin= it.earlyMin;auto earlyMax=  it.earlyMax;auto alarmMax=  it.alarmMax;auto alarmMin=  it.alarmMin;auto main_para= createAttributrNode(doc,fcParaName,"主参数");root.appendChild(main_para);main_para.appendChild(createNode(doc,earlyMin,"earlyMin"));main_para.appendChild(createNode(doc,earlyMax,"earlyMax"));main_para.appendChild(createNode(doc,alarmMax,"alarmMax"));main_para.appendChild(createNode(doc,alarmMin,"alarmMin"));if(!it.attached_contidition_.isEmpty()){auto attribute_para=createAttributrNode(doc,"附属","附属");main_para.appendChild(attribute_para);for(auto item:it.attached_contidition_){int i=0;//QString attribute_para=tr("附属")+QString::number(i);QString num_name=item.num_name;QString subFcParaName=item.subFcParaName;double workMin=item.workMin;double workMax=item.workMax;auto at= createAttributrNode(doc,num_name,num_name);at.appendChild(createNode(doc,subFcParaName,subFcParaName));at.appendChild(createNode(doc,workMin,"workMin"));at.appendChild(createNode(doc,workMax,"workMax"));attribute_para.appendChild(at);i++;}}}}
/*** @brief 创建属性节点* @param* @param*/
QDomElement MainWindow::createAttributrNode(QDomDocument &doc,QString attribute_name,QString node_name)
{QDomElement it = doc.createElement(node_name);it.setAttribute(node_name,attribute_name);return it;
}/*** @brief 创建节点* @param* @param*/
QDomElement MainWindow::createNode(QDomDocument &doc,QString value,QString node_name)
{QDomElement it = doc.createElement(node_name);QDomText text_2 = doc.createTextNode(value);it.appendChild(text_2);return it;
}/*** @brief 创建节点* @param* @param*/
QDomElement MainWindow::createNode(QDomDocument &doc,double value,QString node_name)
{QDomElement it = doc.createElement(node_name);QDomText text_2 = doc.createTextNode(QString::number(value));it.appendChild(text_2);return it;
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

请散户股民看过来,密切关注两件大事

明天股市要开市&#xff0c;不仅散户股民期盼节后股市大涨&#xff0c;上面也同样想在节后来上一个“开门红”。 为此&#xff0c;上面没休假&#xff0c;关起门来办了两件大事&#xff0c;这两天发布消息已提前预热了。 两件大事如下&#xff1a; 一是&#xff0c;上交所10…

什么是 JavaScript 的数组空槽

JavaScript 中的数组空槽一直是一个非常有趣且颇具争议的话题。我们可能对它的实际意义、历史以及现今的新版本中对它的处理方式有所疑问。数组空槽的存在最早可以追溯到 JavaScript 的诞生之初&#xff0c;当时的设计决定让它成为了现代 JavaScript 开发中的一种特别的现象。 …

大数据新视界 --大数据大厂之数据血缘追踪与治理:确保数据可追溯性

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

计算机毕业设计hadoop+spark天气预测 天气可视化 天气大数据 空气质量检测 空气质量分析 气象大数据 气象分析 大数据毕业设计 大数据毕设

Hadoop天气预测系统开题报告 一、研究背景与意义 在信息化和大数据时代&#xff0c;天气数据已成为社会生活和经济发展中不可或缺的重要资源。天气预测系统作为现代气象学的重要组成部分&#xff0c;对于农业生产、交通管理、环境保护以及防灾减灾等方面都具有重要意义。然而…

集智书童 | 用于时态动作检测的预测反馈 DETR !

本文来源公众号“集智书童”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;用于时态动作检测的预测反馈 DETR ! 视频中的时间动作检测&#xff08;TAD&#xff09;是现实世界中的一个基本且具有挑战性的任务。得益于 Transformer …

Chrome浏览器调用ActiveX控件--allWebOffice控件

背景 allWebOffice控件能够实现在浏览器窗口中在线操作文档的应用&#xff08;阅读、编辑、保存等&#xff09;&#xff0c;支持编辑文档时保留修改痕迹&#xff0c;支持书签位置内容动态填充&#xff0c;支持公文套红&#xff0c;支持文档保护控制等诸多办公功能&#xff0c;本…

国庆期间的问题,如何在老家访问杭州办公室的网络呢

背景&#xff1a;国庆期间的问题&#xff0c;如何在老家访问杭州办公室的网络呢 实现方案&#xff1a;异地组网 实现语言&#xff1a;Java 环境&#xff1a;三个网络&#xff0c;一台拥有公网IP的服务器、一台杭州本地机房内服务器、你老家所在网络中的一台电脑&#xff08;…

Linux中的网络指令:ping、netstat、watch、pidof、xargs

目录 Ping指令 netstat指令 watch指令 pidof指令 xargs指令 Ping指令 功能&#xff1a;检测两台主机间的网络连通性 语法&#xff1a;ping [选项] 目标主机的IP地址 &#xff08;192.168.1.1&#xff09;或域名&#xff08;google.com&#xff09; 常见选项&#xff1a…

鸿蒙next开启地图服务

一般手机软件有的都会有开启地图功能&#xff0c;这里说一下怎么开启地图服务 1、 首先你需要配置一些东西&#xff0c;在华为的agc平台上&#xff0c;下边链接就是详细的教程 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/map-config-agc-V5 我说一下你…

分治算法(5)_归并排序_排序数组

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 分治算法(5)_归并排序_排序数组 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 …

如何在各大地图平台上标注店铺定位?

随着互联网的高度普及&#xff0c;地图导航已成为人们日常出行和寻找服务的重要工具。对于商家而言&#xff0c;将自己的店铺定位标注在各大地图平台上&#xff0c;不仅能方便顾客一键导航抵达店铺进行消费&#xff0c;还能提高店铺的线上曝光率&#xff0c;从而吸引更多的潜在…

Chrome浏览器调用ActiveX控件--allWebOffice控件功能介绍

allWebOffice控件概述 allWebOffice控件能够实现在浏览器窗口中在线操作文档的应用&#xff08;阅读、编辑、保存等&#xff09;&#xff0c;支持编辑文档时保留修改痕迹&#xff0c;支持书签位置内容动态填充&#xff0c;支持公文套红&#xff0c;支持文档保护控制等诸多办公功…

鸿蒙开发之ArkUI 界面篇 十九 Flex组件的特点

其语法格式是: Flex(参数对象){ 字组件1, 字组件2, 字组件3, 字组件4 } 这里你会发现&#xff0c;其实和Row容器&#xff0c;Colum容器的语法格式差不多&#xff0c;核心的关键是Colum、Row是不支持换行&#xff0c;实现FlexInterface接口&#xff0c;对外提供的属性是F…

Cesium的一些神奇概念及技术流程(1)

近期要深度研究Cesium。关于Cesium的用法、渲染流程等方面我看很多人都写过。我就写写其中一些可能平时用不到但是比较有趣的内容。因为边研究边写&#xff0c;所以会陆续出几集&#xff0c;然后合并在一起&#xff0c;欢迎大家跟踪。 我的这些文章不打算把一些基本概念展开解…

【判断推理】逻辑基础

1.1 命题 用语言、符号或者式子表达的&#xff0c;可以判断真假的陈述句称为命题&#xff0c;一般写为 若p&#xff0c;则q 真命题&#xff1a;判断为真的语句假命题&#xff1a;判断为假的语句 eg1&#xff1a;小张是中国人&#xff08;若是小张&#xff0c;则是中国人&#…

【操作系统考研】2进程管理(1)

在翻看操作系统知识框架的时候&#xff0c;对一些概念的理解还比较模糊&#xff0c;现在我来理清他们的关系。 操作系统、处理器、进程、线程、内存、存储器、设备、文件的关系 咱们可以把计算机系统想象成一个大工厂&#xff0c;来理解这些概念之间的关系。 操作系统&#xf…

Error:WPF项目中使用oxyplot,错误提示命名空间中不存在“Plot”名称

在OxyPlot中&#xff0c;<oxy:PlotView>和<oxy:Plot>都是用来显示图表的控件&#xff0c;在WPF项目中使用oxyplot之前&#xff0c;先通过NuGet安装依赖包&#xff1a;OxyPlot.Wpf。 <oxy:PlotView>和<oxy:Plot>使用示例&#xff1a; <oxy:PlotVie…

使用Markdown Here插件生成邮件样式

使用Markdown Here插件生成邮件样式 通常大学生们都有给老师、助教使用邮箱发送作业的情景&#xff0c;怎样让自己发送的邮件美观呢&#xff0c;我们可以使用Markdown Here插件美化 以下为结果展示 Markdown Here 插件 官网地址 html代码 <font size"7", face…

复杂度分析复习(C语言版)

一.算法复杂度 算法在编写成可执行程序以后&#xff0c;运行时需要耗费时间资源和&#xff08;内存&#xff09;资源。因此衡量一个算法的好坏&#xff0c;一般是从时间、空间两个维度来衡量的&#xff0c;即时间复杂度和空间复杂度。 现如今&#xff0c;计算机内存越来越大&am…

数学公式编辑器免费版下载,mathtype和latex哪个好用

选择适合自己的公式编辑器需要考虑多个因素。首先&#xff0c;您需要确定编辑器支持的功能和格式是否符合您的需求&#xff0c;例如是否可以插入图片、导出各种文件格式等。其次&#xff0c;您可以考虑编辑器的易用性和界面设计是否符合您的个人喜好。另外&#xff0c;您还可以…