【QT】增删改查 XML 文件的类

news2025/1/8 13:50:56

使用单例类模板实现的对XML文件的节点、属性、文本进行增删改查,可以直接用!
直接POST代码,比较简单好用。
针对以下格式的xml文件比较适用
每个节点的名称都不一样,节点包含了各种属性。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <Param1 Icon="set_1.ico" name="参数设置1">
        <!-- 项目名称,文本类型 -->
        <Node_0 default_value="default_value1" zh-cn="节点0" control_type="LineEdit">设置值1</Node_0>
        <Node_1 default_value="default_value2" zh-cn="节点1" control_type="LineEdit">设置值2</Node_1>
        <Node_2 default_value="default_value3" zh-cn="节点2" control_type="LineEdit">设置值3</Node_2>
    </Param1>
    <Param2 Icon="set_2.ico" name="参数设置2">
        <Node_3 default_value="Item1;Item2;Item3" zh-cn="节点3" control_type="ComboBox">TCPClient</Node_3>
        <Node_4 default_value="true" zh-cn="节点4" control_type="CheckBox">false</Node_4>
    </Param2>
</configuration>

头文件

#pragma once
#include "SingletonCRTP.h"
#include <stdio.h>
#include <iostream>
#include <QObject>
#include <QXmlStreamReader>
#include <QFile>
#include <QtXml\QDomComment>
#include <QDir>
#include <QTextStream>
#include <QCoreApplication>

class XmlHelper: public SingletonCRTP<XmlHelper>
{
	friend class SingletonCRTP<XmlHelper>;


public:
    explicit XmlHelper(const QString& xmlFilePath);
    XmlHelper() {};
    bool loadXml(const QString& filePath);

    QString getNode(const QString& nodeName) const;
    QStringList getNodes(const QString& nodeName) const;
    QStringList getChildNodes(const QString& nodeName) const;

    QStringList getNodes(const QString& nodeName, const QString& attrName) const;
    QString getAttribute(const QString& nodeName, const QString& attrName) const;
    QStringList getAttributes(const QString& nodeName, const QString& attrName) const;
    QString getText(const QString& nodeName) const;
    bool setNodeText(const QString& nodeName, const QString& text);
    bool setNodeAttribute(const QString& nodeName, const QString& attrName, const QString& attrValue);
    bool addNode(const QString& nodeName, const QString& text);
    bool removeNode(const QString& nodeName);
    bool saveToFile(const QString& filePath);
    bool save();

private:
    QDomDocument xmldoc;
    QFile xmlFile;
    QDomNode findFirstNode(const QString& nodeName) const;

};

源文件

#include "XmlHelper.h"
#include <QDomElement>
#include <QDomNodeList>
#include <QXmlStreamReader>

XmlHelper::XmlHelper(const QString& xmlFilePath)
{
	loadXml(xmlFilePath);
}


bool XmlHelper::loadXml(const QString& filePath)
{
	xmlFile.setFileName(filePath);
	if (!xmlFile.open(QIODevice::ReadOnly | QIODevice::Text))
	{
		return false;
	}

	QXmlStreamReader xmlReader(&xmlFile);
	if (!xmldoc.setContent(&xmlReader, true))
	{
		xmlFile.close();
		return false;
	}
	xmlFile.close();


	return true;
}

QDomNode XmlHelper::findFirstNode(const QString& nodeName) const
{
	QDomNodeList nodeList = xmldoc.elementsByTagName(nodeName);
	if (!nodeList.isEmpty())
	{
		return nodeList.at(0);
	}
	return QDomNode();
}

QString XmlHelper::getNode(const QString& nodeName) const
{
	QDomNode node = findFirstNode(nodeName);
	if (!node.isNull())
	{
		QDomElement element = node.toElement();
		return element.tagName();
	}
	return QString();
}

QStringList XmlHelper::getNodes(const QString& nodeName) const
{
	QStringList nodeNames;
	QDomNodeList nodeList = xmldoc.elementsByTagName(nodeName);
	for (int i = 0; i < nodeList.size(); ++i)
	{
		QDomElement element = nodeList.at(i).toElement();
		nodeNames.append(element.tagName());
	}
	return nodeNames;
}

QStringList XmlHelper::getChildNodes(const QString& nodeName) const
{
	QStringList nodeNames;
	QDomNodeList nodeList = xmldoc.elementsByTagName(nodeName);
	for (int i = 0; i < nodeList.size(); ++i)
	{
		QDomElement element = nodeList.at(i).toElement();
		QDomNodeList childs = element.childNodes();
		for (int j = 0; j < childs.size(); ++j)
		{
			if (childs.at(j).toElement().tagName() != "")
			{
				nodeNames.append(childs.at(j).toElement().tagName());
			}
		}
	}
	return nodeNames;
}

QStringList XmlHelper::getNodes(const QString& nodeName, const QString& attrName) const
{
	QStringList nodeNames;
	QDomNodeList nodeList = xmldoc.elementsByTagName(nodeName);
	for (int i = 0; i < nodeList.size(); ++i)
	{
		QDomElement element = nodeList.at(i).toElement();
		if (element.attribute("name") == attrName)
		{
			nodeNames.append(element.tagName());
		}
	}
	return nodeNames;
}

QString XmlHelper::getAttribute(const QString& nodeName, const QString& attrName) const
{
	QDomNode node = findFirstNode(nodeName);
	if (!node.isNull())
	{
		QDomElement element = node.toElement();
		return element.attribute(attrName);
	}
	return QString();
}

QStringList XmlHelper::getAttributes(const QString& nodeName, const QString& attrName) const
{
	QStringList attrValues;
	QDomNodeList nodeList = xmldoc.elementsByTagName(nodeName);
	for (int i = 0; i < nodeList.size(); ++i)
	{
		QDomElement element = nodeList.at(i).toElement();
		if (element.hasAttribute(attrName))
		{
			attrValues.append(element.attribute(attrName));
		}
	}
	return attrValues;
}

QString XmlHelper::getText(const QString& nodeName) const
{
	QDomNode node = findFirstNode(nodeName);
	if (!node.isNull())
	{
		QDomElement element = node.toElement();
		return element.text();
	}
	return QString();
}


bool XmlHelper::setNodeText(const QString& nodeName, const QString& text)
{
	QDomNode node = findFirstNode(nodeName);
	if (!node.isNull())
	{
		QDomNode oldnode = node.firstChild();
		node.firstChild().setNodeValue(text);
		QDomNode newnode = node.firstChild();     //值修改过后
		node.replaceChild(newnode, oldnode);      //调用节点的replaceChild方法实现修改功能

		return true;
	}
	return false;
}

bool XmlHelper::setNodeAttribute(const QString& nodeName, const QString& attrName, const QString& attrValue)
{
	QDomNode node = findFirstNode(nodeName);
	if (!node.isNull())
	{
		QDomElement element = node.toElement();
		element.setAttribute(attrName, attrValue);
		return true;
	}
	return false;
}

bool XmlHelper::addNode(const QString& nodeName, const QString& text)
{
	QDomElement root = xmldoc.documentElement();
	QDomElement newNode = xmldoc.createElement(nodeName);
	newNode.appendChild(xmldoc.createTextNode(text));
	root.appendChild(newNode);
	return true;
}

bool XmlHelper::removeNode(const QString& nodeName)
{
	QDomNodeList nodeList = xmldoc.elementsByTagName(nodeName);
	for (int i = 0; i < nodeList.size(); ++i)
	{
		QDomNode node = nodeList.at(i);
		node.parentNode().removeChild(node);
	}
	return true;
}

bool XmlHelper::saveToFile(const QString& filePath)
{
	QFile file(filePath);

	if (!file.open(QFile::WriteOnly | QFile::Truncate | QFile::Text))
	{
		return false;
	}
	try
	{
		QTextStream stream(&file);
		stream.setCodec("utf-8");
		xmldoc.save(stream, 4, QDomNode::EncodingFromTextStream);
		file.close();
		return true;
	}
	catch (const std::exception&)
	{
		return false;
	}
}

bool XmlHelper::save()
{
	if (!xmlFile.open(QFile::WriteOnly | QFile::Truncate | QFile::Text))
	{
		return false;
	}
	try
	{
		QTextStream stream(&xmlFile);
		stream.setCodec("utf-8");
		xmldoc.save(stream, 4, QDomNode::EncodingFromTextStream);
		xmlFile.close();
		return true;
	}
	catch (const std::exception& e)
	{
		std::cout << e.what() << std::endl;
		return false;
	}
}


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

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

相关文章

UE5本地化和国际化语言

翻译语言 工具 - 本地化控制板 Localization Dashboard 修改图中这几个地方就可以 点击箭头处&#xff0c;把中文翻译成英语&#xff0c;如果要更多语言就点 添加新语言 最后点击编译即可 编译完&#xff0c;会在目录生成文件夹 设置界面相关蓝图中设置 切换本地化语言 必须在…

python学习笔记—15—数据容器之列表

1. 数据容器 列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict) 2. 列表 (1) 定义 tmp_list ["super", "carry", "doinb"] print(f"tmp_list {tmp_list}, tmp_list type is {type(tmp_list)}") tmp_list1 ["doi…

【简博士统计学习方法】第1章:4. 模型的评估与选择

4. 模型的评估与选择 4.1 训练误差与测试误差 假如存在样本容量为 N N N的训练集&#xff0c;将训练集送入学习系统可以训练学习得到一个模型&#xff0c;我们将这么模型用决策函数的形式表达&#xff0c;也就是 y f ^ ( x ) y\hat{f}(x) yf^​(x)&#xff0c;关于模型的拟合…

Unity自定义编辑器:基于枚举类型动态显示属性

1.参考链接 2.应用 target并设置多选编辑 添加[CanEditMultipleObjects] using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor;[CustomEditor(typeof(LightsState))] [CanEditMultipleObjects] public class TestInspector :…

cesium小知识:3D tiles 概述、特点、示例

Cesium 的 3D Tiles 是一种高效的、流式传输的三维地理空间数据格式,专为在Web浏览器中快速渲染大规模三维场景而设计。3D Tiles 支持多种几何类型,包括点云、多边形、模型等,并且可以包含丰富的属性信息和层次细节(LOD, Level of Detail)结构,以确保不同设备和网络条件下…

【微服务】7、分布式事务

在分布系统中&#xff0c;一个业务由多个服务合作完成&#xff0c;每个服务有自己的事务&#xff0c;多个事务需同时成功或失败&#xff0c;这样的事务称为分布式事务。 其中每个服务的事务叫分支事务&#xff0c;整个业务的统一事务叫全局事务。 分布式事务相关知识讲解 课程引…

基于 Boost.Asio 和 Boost.Beast 的异步 HTTP 服务器(学习记录)

已完成功能&#xff1a; 支持 GET 和 POST 请求的路由与回调处理。 解析URL请求。 单例模式 管理核心业务逻辑。 异步 I/O 技术和 定时器 控制超时。 通过回调函数注册机制&#xff0c;可以灵活地为不同的 URL 路由注册处理函数。 1. 项目背景 1.1 项目简介 本项目是一个基于…

Linux标准IOday1

1:思维导图 2:将 student.c这个练习题&#xff0c;改成链表后实现 头文件link.h #ifndef __STRUCT_H__ #define __STRUCT_H__ #include <stdio.h> #include <stdlib.h> typedef struct Student{char name[20];double math;double chinese;double english;double…

全局变量(PHP)(小迪网络安全笔记~

免责声明&#xff1a;本文章仅用于交流学习&#xff0c;因文章内容而产生的任何违法&未授权行为&#xff0c;与文章作者无关&#xff01;&#xff01;&#xff01; 附&#xff1a;完整笔记目录~ ps&#xff1a;本人小白&#xff0c;笔记均在个人理解基础上整理&#xff0c;…

gateway的路径匹配介绍

gateway是一个单独服务。通过网关端口和predicates进行匹配服务 1先看配置。看我注解你就明白了。其实就是/order/**配置机制直接匹配到orderservice服务。 2我试着请求一个路径&#xff0c;请求成功。下面第三步是请求的接口。 3接口。

RabbitMQ-基本使用

RabbitMQ: One broker to queue them all | RabbitMQ 官方 安装到Docker中 docker run \-e RABBITMQ_DEFAULT_USERrabbit \-e RABBITMQ_DEFAULT_PASSrabbit \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \--network mynet\-d \rabbitmq:3…

模式识别-Ch2-分类错误率

分类错误率 最小错误率贝叶斯决策 样本 x x x的错误率&#xff1a; 任一决策都可能会有错误。 P ( error ∣ x ) { P ( w 2 ∣ x ) , if we decide x as w 1 P ( w 1 ∣ x ) , if we decide x as w 2 P(\text{error}|\mathbf{x})\begin{cases} P(w_2|\mathbf{x}), &…

CAD批量打印可检索的PDF文件

本文虽介绍CAD使用方法&#xff0c;但还是劝告大家尽早放弃使用CAD软件。。。。太TM难用了 当你打开CAD时发现如下一堆图纸&#xff0c;但是不想一个一个打印时。你可以按照下面操作实现自动识别图框实现批量打印。 1.安装批量打印插件 2.安装后打开CAD&#xff0c;输入命令Bp…

BERT:深度双向Transformer的预训练用于语言理解

摘要 我们介绍了一种新的语言表示模型&#xff0c;名为BERT&#xff0c;全称为来自Transformer的双向编码器表示。与最近的语言表示模型&#xff08;Peters等&#xff0c;2018a&#xff1b;Radford等&#xff0c;2018&#xff09;不同&#xff0c;BERT旨在通过在所有层中联合调…

搭建企业AI助理的创新应用与案例分析

在大健康零售行业&#xff0c;企业面临着日益增长的市场需求和复杂的供应链管理挑战。AI助理的应用不仅能够提升客户服务效率&#xff0c;还能优化供应链管理&#xff0c;降低运营成本。 一、AI助理在大健康零售行业的创新应用 个性化健康咨询 AI助理可以通过分析客户的健康…

apex安装

安装过程复杂曲折&#xff0c;网上说的很多办法&#xff0c;貌似成功了&#xff0c;实际还是没起作用。 先说成功过程&#xff0c;执行下面命令&#xff0c;安装成功&#xff08;当然&#xff0c;前提是你要先配置好编译环境&#xff09;&#xff1a; &#xff08;我的环境&a…

select下拉框,首次进入页面没有显示value的情况

bug场景&#xff1a; 类似这种bug情况排查如下&#xff1a; 首先 理解含义 options就是存放键值对的&#xff0c;id就是key&#xff0c;对上了它就自动把label显示 而且如果你用来当作key和label的字段&#xff0c;与后端返回的不一致&#xff0c;还可以进行更改 其次 排查接…

krpano 实现文字热点中的三角形和竖杆

krpano 实现文字热点中的三角形和竖杆 实现文字热点中的三角形和竖杆 一个后端写前端真的是脑阔疼 一个后端写前端真的是脑阔疼 一个后端写前端真的是脑阔疼 实现文字热点中的三角形和竖杆 上图看效果 v&#xff1a;2549789059

playwright 录制

一、新建项目TestProject3 二、准备swagger 三、开始录制 打开PowerShell 7 (x64) cd D:\xxx\xxx\VS2022Projects\TestProject3\TestProject3\bin\Debug\net8.0 pwsh playwright.ps1 codegen --targetcsharp -b chromium localhost:5252/swagger/index.html #支持的语言 java…

uni-app 资源引用(绝对路径和相对路径)方法汇总

文章目录 一、前言&#x1f343;二、绝对路径和相对路径2.1 绝对路径2.2 相对路径 三、引用组件四、引用js4.1 js 文件引入4.2 NPM支持 五、引用css六、引用json6.1 json文件引入 七、引用静态资源7.1 模板内引入静态资源7.2 css 引入静态资源7.3 js/uts 引入静态资源7.4 静态资…