qt_c++_xml存这种复杂类型

news2024/11/25 11:40:18

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_NAMESPACE


typedef 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_OBJECT

public:
    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.coloradmin.cn/o/2195281.html

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

相关文章

【MySQL】使用 JDBC 连接数据库

文章目录 前言1. 认识 JDBC1.1 概念1.2 好处 2. 使用 JDBC2.1 安装数据驱动包2.2 把 jar 包导入到项目中2.3 代码编写2.4 测试结果 3. 代码优化4. 源码展示结语 前言 在 MySQL 系列中&#xff0c;我们介绍了很多内容&#xff0c;包括但不限于建库建表&#xff0c;增删查改等等…

如何使用MATLAB代码生成器生成ADRC跟踪微分器(TD) PLC源代码(SCL)

ADRC线性跟踪微分器TD详细测试 ADRC线性跟踪微分器TD详细测试(Simulink 算法框图+CODESYS ST+博途SCL完整源代码)-CSDN博客文章浏览阅读383次。ADRC线性跟踪微分器(ST+SCL语言)_adrc算法在博途编程中scl语言-CSDN博客文章浏览阅读784次。本文介绍了ADRC线性跟踪微分器的算法和…

图论day55|深度优先搜索理论基础、98. 所有可达路径(卡码网)

图论day55|深度优先搜索理论基础、98. 所有可达路径(卡码网&#xff09; 思维导图汇总深度优先搜索理论基础98.所有可达路径(卡码网)1.邻接矩阵法2.邻接表法 思维导图汇总 深度优先搜索理论基础 深度优先搜索&#xff08;dfs&#xff09;与广度优先搜索&#xff08;bfs&#xf…

@Transactional声明式事务回调编程

文章目录 1. 理论阐述2. 代码实现2.1. 问题代码2.2. 改进方案 本文参考&#xff1a; 事务回调编程 大事务问题 1. 理论阐述 最近在学习数据库事务的过程中&#xff0c;了解到了大事务的危害&#xff1a; 并发情况下&#xff0c;数据库连接资源容易耗尽锁定数据较多&#xff0…

SpringBoot企业级开发(SpringSecurity安全控制+pringBatch批处理+异步消息+系统集成SpringIntegration)

Spring Security 多个过滤器来实现所有安全的功能&#xff0c;只需要注册一个特殊的DelegatingFilterProxy过滤器到WebAppliationInitializer即可 实际使用中需要让自己的Initializer类继承AbstractSecurity WebApplicationInitializer抽象类即可。 AbstractSecurityWebAppli…

【瑞昱RTL8763E】刷屏

1 显示界面填充 用户创建的各个界面在 rtk_gui group 中。各界面中 icon[]表对界面进行描述&#xff0c;表中的每个元素代表一 个显示元素&#xff0c;可以是背景、小图标、字符等&#xff0c;UI_WidgetTypeDef 结构体含义如下&#xff1a; typedef struct _UI_WidgetTypeDef …

每年每门学科排名第一的学生 和每年总成绩都有所提升的学生

一张学生成绩表(student_scores)&#xff0c;有year-学年&#xff0c;subject-课程&#xff0c;student-学生&#xff0c;score-分数这四个字段&#xff0c;请完成如下问题&#xff1a; 问题1&#xff1a;每年每门学科排名第一的学生 问题2&#xff1a;每年总成绩都有所提升的…

【STM32 HAL库】MPU6050 DMP库移植 与 自检失败的处理

【STM32 HAL库】MPU6050 DMP库移植 与 自检失败的处理 本文参考移植步骤文件配置代码修改inv_mpu.cinv_mpu.hinv_mpu_dmp_motion_driver.c 使用 自检失败怎么处理ret -1改正DEBUG过程 ret -9改正DEBUG过程 本文参考 B站 CSDN 移植步骤 文件配置 新建一个 dmp 文件夹 并将…

【斯坦福CS144】Lab1

一、实验目的 1.实现一个流重组器——一个将字节流的小块 &#xff08;称为子串或段 &#xff09;按正确顺序组装成连续的字节流的模块&#xff1b; 2.深入理解 TCP 协议的工作方式。 二、实验内容 编写一个名为"StreamReassembler"的数据结构&#xff0c;它负责…

【Nacos入门到实战十四】Nacos配置管理:集群部署与高可用策略

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

原神5.1前瞻网页HTML+CSS+JS

这篇文章主要是总结一下我在制作页面的时候用到的一些技术以及经验总结&#xff0c;博主也是第一次写网页&#xff0c;代码也是在不断地“进化”&#xff0c;哪里写的不好大家可以随意指出。 下面就是一些经验总结&#xff0c;如果想看具体效果我这里也不好展示&#xff0c;需要…

pytorch导入数据集

1、概念&#xff1a; Dataset&#xff1a;一种数据结构&#xff0c;存储数据及其标签 Dataloader&#xff1a;一种工具&#xff0c;可以将Dataset里的数据分批、打乱、批量加载并进行迭代等 &#xff08;方便模型训练和验证&#xff09; Dataset就像一个大书架&#xff0c;存…

QSerialPort 串口通信示例

之前使用过MFC写过串口通信的示例&#xff0c;今年学了Qt&#xff0c;特意使用Qt写了串口通信的示例&#xff0c;发现比MFC要容易一些&#xff0c; MFC串口示例如下&#xff1a; Qt示例如下&#xff1a; Qt这个做的很简单&#xff0c;主要还是想验证一下api&#xff0c; 核心…

今日指数day8实战补充(上)

1.用户管理 1.多条件综合查询 1.1 多条件综合查询接口说明 1&#xff09;原型效果 2&#xff09;接口说明 功能描述&#xff1a;多条件综合查询用户分页信息&#xff0c;条件包含&#xff1a;分页信息 用户创建日期范围 服务路径&#xff1a;/api/users 服务方法&#xff1…

Linux的Tomcat安装部署

1.下载jdk11 java11的官方URL 此时进入可能会有登录注册,挺简单的,注册登录就好 2.上传到Linux 3.解压 命令: tar -zxvf /root/linux.jdk/jdk-11.0.24_linux-x64_bin.tar.gz 4.移动解压文件夹到新建文件夹 新建文件夹: mkdir -p /export/server 移动命令: mv jdk-11.0…

联想服务器配置阵列、安装操作系统

文章目录 [toc]1.配置阵列2.制作启动盘3.安装系统 1.配置阵列 1.根据提示进入BIOS设置&#xff08;F1&#xff09; 2.系统设置 3.存储 4.第四步可以看到raid卡信息 5.Main Menu 6.Configuration Management 7.Create Virtual Drive 8.Select RAID Level raid5 9.Select Drives…

透明物体的投射和接收阴影

1、让透明度测试Shader投射阴影 &#xff08;1&#xff09;同样我们使用FallBack的形式投射阴影&#xff0c;但是需要注意的是&#xff0c;FallBack的内容为&#xff1a;Transparent / Cutout / VertexLit&#xff0c;该默认Shader中会把裁剪后的物体深度信息写入到 阴影映射纹…

降重秘籍:如何利用ChatGPT将重复率从45%降至10%以下?

AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 重复率高达45%&#xff1f;很多人一查论文的重复率&#xff0c;瞬间想“完了&#xff0c;这次真的要重写了”。但其实不用这么绝望&#xff01;有了ChatGPT&#xff0c;降重真的没那么难。今天就教你几招&a…

VGG16模型实现MNIST图像分类

MNIST图像数据集 MNIST&#xff08;Modified National Institute of Standards and Technology&#xff09;是一个经典的机器学习数据集&#xff0c;常用于训练和测试图像处理和机器学习算法&#xff0c;特别是在数字识别领域。该数据集包含了大约 7 万张手写数字图片&#xf…

wsl环境下安装MySQL5.7

安装操作需root权限&#xff1a; 1-通过 sudo su - &#xff0c;切换到root用户。 2-在每一个命令前加上sudo&#xff0c;临时提升权限 1、下载apt仓库文件 wget https://dev.mysql.com/get/mysql-apt-config_0.8.12-1_all.deb 安装包是.deb的文件2、配置仓库&#xff0c;使…