动态xml操作

xml工具类头文件

#ifndef XMLTOOL_H
#define XMLTOOL_H

#include <QObject>
#include "pugixml.hpp"
#include <iostream>
#include <QList>


using namespace pugi;
using namespace  std;

class XmlTool:public QObject{
  Q_OBJECT
public:
    static xml_document* loadXmlDocument(const QString& filePath);

    static bool saveXmlDocument(const QString& filePath, xml_document* doc);

    static xml_node getNode(xml_document* doc, const QString& xpath);

    static xml_node appendNode(xml_node* parent, const QString& name);

    static bool setNodeText(xml_node* node, const QString& text);

    static QString getNodeText(xml_node* node);

    static bool deleteNode(xml_node* node);

    static void freeXmlDocument(xml_document* doc);
    /**
     * @brief docFrameX
     * @param filePath
     * @param targetPath
     */
    static void docFrameX(const QString filePath,const QString targetPath);
    /**
     *
     * @brief getAllNodesX
     * @param root
     */
    static void getAllNodesX(xml_node root);
    /**
     *
     * @brief handleDomNode
     * @param node
     * @param list
     */
    static void handleDomNode(xml_node node,QList<xml_node>* list);
};
#endif // XMLTOOL_H


xml工具类Cpp

#include "XmlTool.h"
#include <QDir>

xml_document* XmlTool::loadXmlDocument(const QString& filePath) {
    auto doc = new xml_document();
    xml_parse_result result = doc->load_file(QDir::toNativeSeparators(filePath).toStdString().c_str());
    if (result.status != status_ok) {
        delete doc;
        return nullptr;
    }
    return doc;
}

bool XmlTool::saveXmlDocument(const QString& filePath, xml_document* doc) {
    return doc->save_file(filePath.toStdString().c_str());
}

xml_node XmlTool::getNode(xml_document* doc, const QString& xpath) {
    auto result = doc->select_node(xpath.toStdString().c_str());
    if (result) {
        return result.node();
    }
    return xml_node();
}

xml_node XmlTool::appendNode(xml_node* parent, const QString& name) {
    return parent->append_child(name.toStdString().c_str());
}

bool XmlTool::setNodeText(xml_node* node, const QString& text) {
    if (node) {
        node->text().set(text.toStdString().c_str());
        return true;
    }
    return false;
}

QString XmlTool::getNodeText(xml_node* node) {
    if (node)
        return QString::fromStdString(node->text().as_string());
    return QString();
}

bool XmlTool::deleteNode(xml_node* node) {
    if (node && node->parent()) {
        xml_node parent = node->parent();
        parent.remove_child(*node);
        delete node;
        return true;
    }
    return false;
}

void XmlTool::freeXmlDocument(xml_document* doc) {
    if (doc)
        delete doc;
}

void XmlTool::docFrameX(const QString filePath, const QString targetPath)
{
    xml_document* doc = loadXmlDocument(filePath);
    if(doc){
        getAllNodesX(doc->root());
        saveXmlDocument(targetPath,doc);
    }
}

void XmlTool::getAllNodesX(xml_node root)
{
    for(xml_node node = root.first_child(); node; node = node.next_sibling()) {
        const QString tagName =node.name();
        cout<<"tagName============"<<tagName.toStdString()<<endl;
        if(tagName=="DOM1"){
            QList<xml_node> list;
            handleDomNode(node,&list);
           xml_node previousNode = node.previous_sibling();
            for(xml_node childNode:list){
                if(!previousNode.empty()){
                    root.insert_copy_after(childNode,previousNode);
                }else{
                    root.append_copy(childNode);
                }
            }
            root.remove_child(node);
            getAllNodesX(root);
        }
        getAllNodesX(node);
    }
}

void XmlTool::handleDomNode(xml_node node, QList<xml_node> *list)
{
    QString type = node.attribute("type").value();
    if(type=="for"){
        QString forCountStrRoot = node.attribute("forCount").value();
        int forCountRoot = forCountStrRoot.toInt();
        for(int index=0;index<forCountRoot;index++){
            for(xml_node nodeC = node.first_child(); nodeC; nodeC = nodeC.next_sibling()) {
                list->append(nodeC);
            }
        }
    }
}

主函数

#include <QApplication>
#include "XmlTool.h"
#include <QDateTime>

int main(int argc, char *argv[])
{

    qRegisterMetaType<QList<xml_node>>("QList<xml_node>");
    Q_UNUSED(argc);
    Q_UNUSED(argv);
    QString xmlPath = "C:\\Users\\tirkl\\Test.xml";
    QString d = QDateTime::currentDateTime().toString("yyyyMMddhhmmss");
    QString xmlPathX = "C:\\Users\\tirkl\\"+d+".xml";
    XmlTool::docFrameX(xmlPath,xmlPathX);
    return 0;
}

测试xml

<DocFrame>
        <Data  id="1" name="jask" age="12" email="xxxx@hout.com" remark="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"/>
        <DOM1 type="for" forCount="2">
                <Data  id="1" name="jask" age="12" email="xxxx@hout.com" remark="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"> 
                        <DOM1 type="for" forCount="2">
                                <Data  id="1.1" name="jask" age="12" email="xxxx@hout.com" remark="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" pid="1">
                                        <DOM1 type="for" forCount="2">
                                                <Data  id="1.1.1" name="jask" age="12" email="xxxx@hout.com" remark="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" pid="1.1"/>
                                        </DOM1>
                                </Data> 
                        </DOM1>
                </Data>
        </DOM1>
        <Data  id="1" name="jask" age="12" email="xxxx@hout.com" remark="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"/>
</DocFrame>

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

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

相关文章

GaussDB数据库SQL系列-复合查询

目录 一、前言 二、复合查询基础 三、实际应用示例 1、使用UNION合并查询结果 2、使用INTERSECT找出共同元素 3、使用EXCEPT排除特定结果 四、高级技巧 1、子查询实例 2、JOIN的应用 五、总结 一、前言 GaussDB是华为自主创新研发的分布式关系型数据库&#xff0c;具…

解决网络ping不通问题

网络ping不通可能有多种原因&#xff0c;以下是一些常见的解决方法&#xff1a; 1. 检查IP地址和域名&#xff1a;确保你使用的是正确的IP地址或者域名来ping目标设备。如果IP地址或者域名错误&#xff0c;ping请求将无法到达目标设备。 2. 检查网络连接&#xff1a;首先确保…

SAP PP学习笔记11 - PP中的MRP相关概念,参数,配置

上文讲了作业区的概念及配置。 SAP PP学习笔记08 - 作业区&#xff08;工作中心Work Center&#xff09;&#xff0c;作业区Customize-CSDN博客 SAP PP学习笔记09 - 作业区&#xff08;工作中心Work Center&#xff09;Customize2&#xff08;管理码&#xff0c;班次顺序&…

【数据结构(邓俊辉)学习笔记】列表03——有序列表

文章目录 0. 概述1. 唯一化2. 查找2.1 实现2.2 顺序查找2.3 复杂度 0. 概述 介绍下有序列表。 若列表中所有节点的逻辑次序与其大小次序完全一致&#xff0c;则称作有序列表&#xff08;sorted list&#xff09;。为保证节点之间可以定义次序&#xff0c;依然假定元素类型T直接…

制冷系统原理分析图

饱和蒸气 过冷液、过热蒸气 温度单位通常用℃表示(水的冰点为0℃&#xff0c;沸点为100℃)&#xff0c;在计算热量时一般使用热力学绝对温度K。 压力 表压&#xff1a;&#xff08;kg/cm2&#xff09;⇒ MPa。是指压力表所指示的压力&#xff0c;大气压力为0。 绝对压力 &am…

掌握高效技巧:大量文件如何管理的方法,轻松批量重命名电脑文件

在日常生活和工作中&#xff0c;我们经常需要处理大量的文件&#xff0c;尤其是需要进行批量重命名的情况。掌握高效的文件管理技巧&#xff0c;不仅能提高工作效率&#xff0c;还能让文件系统更加有序&#xff0c;方便日后的查找和使用。下面一起来看看云炫文件管理器一些实用…

vue打包报错:CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

前言&#xff1a; vue项目&#xff0c;打包报错&#xff1a;CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 报错现象&#xff1a; 报错原因&#xff1a; 这个错误是由Node.js在尝试分配内存时因为系统的可用内存不足而发生的。"JavaScript heap…

Linux的基本指令(下)

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 这篇博客续博主的上篇博客Linux基本指令。 07 …

Acrobat Pro DC全系列安装教程、Acrobat Mac版

Adobe Acrobat Pro DC2023 是一款专业的 PDF 文档编辑和管理软件&#xff0c;由 Adobe 公司开发。它是 Acrobat 产品系列中最全面、最强大的版本之一&#xff0c;提供了许多功能和工具&#xff0c;可以帮助用户轻松地创建、编辑、签署和共享 PDF 文件 百度网盘 内附安装步骤 一…

『FPGA通信接口』DDR(4)DDR3内存条SODIMMs读写测试

文章目录 前言1.MIG IP核配置2.测试程序3.DDR应用4.传送门 前言 不论是DDR3颗粒还是DDR3内存条&#xff0c;xilinx都是通过MIG IP核实现FPGA与DDR的读写。本文区别于DDR颗粒&#xff0c;记录几个与颗粒配置不同的地方。关于DDR的原理与MIG IP的简介&#xff0c;请查看前面文章&…

Ts创建的详细过程及配置步骤(傻瓜式配置创建),最后效果展示

一:首先创建一个 空文件夹 二:使用编辑器打开,再创建一个src文件夹,然后按照以下步骤

批量文件重命名神器:以创建时间来命名,让你的文件井然有序!

在信息爆炸的时代&#xff0c;我们每天都在与无数的文件打交道。你是否曾为文件名的混乱而烦恼&#xff1f;是否曾为了快速找到某个文件而苦苦搜索&#xff1f;今天&#xff0c;我要为大家介绍一款神奇的工具——时光机&#xff0c;它能根据你的文件创建时间进行批量重命名&…

MBD、数字主线、MBSE、基于模型的企业等概念的比较分析

以产品研制全生命周期集成乃至新一步扩展为数字孪生为目的&#xff0c;目前发展的基于模型的定义&#xff08;MBD&#xff09;、数字主线&#xff08;DTh&#xff09;、基于模型的系统功能&#xff08;MBSE&#xff09;和基于模型的企业&#xff08;MBE&#xff09;等均有自身的…

一个肉夹馍思考的零耦合设计

刷抖音听说知识付费是普通人的一个收入增长点&#xff0c;写了三十几篇文章一毛钱没赚&#xff0c;感觉有点沮丧。天上下着小雨雨&#xff0c;稀稀嗦嗦的&#xff0c;由于了很久还是买了一个&#x1f928;。 忽然觉得生活有点悲催&#xff0c;现在已经变得斤斤计较&#xff0c;…

新手必看!场外个股期权的权利金估算公式

场外个股期权的权利金估算公式 场外个股期权的权利金估算公式通常涉及多个因素&#xff0c;这些因素共同决定了权利金的具体数额。虽然具体的估算公式可能因不同的交易平台、交易规则和标的资产而有所差异&#xff0c;但一般来说&#xff0c;权利金的计算会考虑以下几个关键要…

天软特色因子看板 (2024.4 第8期)

该因子看板跟踪天软特色因子A05005(近一月单笔流出金额占比(%)&#xff0c;该因子为近一月单笔流出金额占比(% 均值因子&#xff0c;用以刻画下跌时的 单成交中可能存在的抄底现象 今日为该因子跟踪第8期&#xff0c;跟踪其在SW801080 (申万电子) 中的表现&#xff0c;要点如下…

Java 对象创建过程十步法!你get到了吗?

Java 中对象的创建过程可以概括为十个步骤&#xff0c;从类加载到实例化对象。 下面详细讲解一下每个步骤&#xff1a; 1. 类加载&#xff1a; Java 虚拟机在加载类时&#xff0c;会检查类的字节码&#xff0c;并将其加载到内存中。类加载的过程包括加载、连接&#xff08;验…

Amine-PEG-Amine,956496-54-1在生物成像、生物传感器等领域具有广泛的应用

【试剂详情】 英文名称 Amine-PEG-Amine&#xff0c;NH2-PEG-NH2 中文名称 氨基-聚乙二醇-氨基&#xff0c;氨基PEG氨基&#xff0c; 双端氨基聚乙二醇 CAS号 956496-54-1 外观性状 由分子量决定&#xff0c;液体或者固体 分子量 0.4k&#xff0c;0.6k&#xff0c;1k&…

【JAVA |开篇】JAVA入门及JDK环境配置

目录 一、JIAVA语言 二、Java开发环境安装 三、初识Java的main方法 四、注释 一、JIAVA语言 Java 是一种优秀的程序设计语言 &#xff0c;它具有令人赏心悦目的语法和易于理解的语义 Write once, Run anywhere&#xff08;这句话体现了JAVA语言的核心&#xff0c;一次运行 任…

Vue从入门到精通-14-Vue组件

子组件的定义和注册 我们在本文的第一段中&#xff0c;通过Vue.component形式定义的是全局组件。这一段中&#xff0c;我们来讲一下子组件。 在父组件中定义子组件 比如说&#xff0c;一个账号模块是父组件&#xff0c;里面分为登陆模块和注册模块&#xff0c;这两个晓得模块…
最新文章