XML读取和设置例子

在Qt C++中,可以使用Qt的 QDomDocument类来读取、更新和保存XML文件。这个类提供了对XML文档的强大操作能力,支持通过DOM(文档对象模型)对XML进行读取、修改、添加和删除节点等操作。
下面是一个详细的例子,演示如何在Qt中使用 QDomDocument来读取、更新一个XML文件,并保存修改后的XML文件。

例子:

假设我们有一个XML文件config.xml,内容如下:
<config><database><host>localhost</host><port>3306</port><user>root</user><password>password123</password></database><log><level>info</level></log>
</config>
我们需要做的操作是:
  1. 读取XML文件。
  2. 更新database/port为5432。
  3. 更新log/level为debug。
  4. 保存更新后的XML文件。

代码示例:

#include <QtCore>
#include <QDomDocument>
#include <QFile>
#include <QDebug>int main() {// 创建一个QFile对象,用于读取XML文件QFile file("config.xml");// 打开文件以进行读取if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {qDebug() << "Error opening file for reading";return -1;}// 创建一个QDomDocument对象用于解析XMLQDomDocument doc;// 读取XML内容并加载到QDomDocument中if (!doc.setContent(&file)) {qDebug() << "Error parsing XML file";file.close();return -1;}file.close();  // 关闭文件// 获取根元素(在这个例子中是)QDomElement root = doc.documentElement();// 获取元素QDomElement database = root.firstChildElement("database");// 获取并更新元素QDomElement portElement = database.firstChildElement("port");if (!portElement.isNull()) {portElement.firstChild().setNodeValue("5432");  // 更新端口号为5432}// 获取并更新元素中的QDomElement logElement = root.firstChildElement("log");QDomElement levelElement = logElement.firstChildElement("level");if (!levelElement.isNull()) {levelElement.firstChild().setNodeValue("debug");  // 更新日志级别为debug}// 保存修改后的XML文件QFile outFile("updated_config.xml");if (!outFile.open(QIODevice::WriteOnly | QIODevice::Text)) {qDebug() << "Error opening file for writing";return -1;}QTextStream out(&outFile);doc.save(out, 4);  // 使用4个空格的缩进来保存文件outFile.close();qDebug() << "XML file updated successfully!";return 0;
}

代码解释:

1. 读取XML文件
QFile file("config.xml");if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {qDebug() << "Error opening file for reading";return -1;
}
  • 使用QFile打开XML文件并以只读模式读取。
  • 如果文件无法打开,打印错误并退出程序。
2. 加载XML内容
QDomDocument doc;if (!doc.setContent(&file)) {qDebug() << "Error parsing XML file";file.close();return -1;
}
file.close();
  • 创建一个QDomDocument对象来解析XML文件内容。
  • setContent(&file)将文件内容加载到QDomDocument中。如果解析失败,输出错误并退出。
3. 获取根元素
QDomElement root = doc.documentElement();
  • documentElement()方法返回XML文档的根元素。在本例中,根元素是`config`。
4. 更新XML中的元素
QDomElement database = root.firstChildElement("database");
QDomElement portElement = database.firstChildElement("port");
if (!portElement.isNull()) {portElement.firstChild().setNodeValue("5432");
}
  • 使用firstChildElement("database")找到第一个`host`元素。
  • 使用firstChildElement("port")找到`port`元素。
  • 使用firstChild().setNodeValue("5432")更新`port`的值为5432。
同样地,更新log/level:
QDomElement logElement = root.firstChildElement("log");
QDomElement levelElement = logElement.firstChildElement("level");
if (!levelElement.isNull()) {levelElement.firstChild().setNodeValue("debug");
}
  • 使用firstChildElement("log")找到`log`元素。
  • 使用firstChildElement("level")找到`level`元素。
  • 使用firstChild().setNodeValue("debug")更新`level`的值为debug。
5. 保存修改后的XML文件
QFile outFile("updated_config.xml");
if (!outFile.open(QIODevice::WriteOnly | QIODevice::Text)) {qDebug() << "Error opening file for writing";return -1;
}QTextStream out(&outFile);
doc.save(out, 4);  // 使用4个空格的缩进来保存文件
outFile.close();
  • 创建一个新的QFile对象来保存修改后的XML文件。
  • doc.save(out, 4)将修改后的XML内容写入文件,使用4个空格进行缩进以增强可读性。
  • 保存完成后,关闭文件。
6. 程序输出
qDebug() << "XML file updated successfully!";
  • 如果所有操作都成功完成,输出一条成功消息。

总结:

  • 使用QFile读取XML文件,使用QDomDocument解析和修改XML内容。
  • 通过DOM操作(如firstChildElement()、setNodeValue()等)更新XML中的元素值。
  • 使用doc.save()将修改后的XML文件保存到磁盘。

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

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

相关文章

ubuntu 远程桌面 xrdp + frp

经测试VNC启动桌面&#xff0c;并非常规的桌面。 不如RDP好用。因此不用VNC server 一类。 直接安装xrdp 实现UBUNTU 到UBUNTU 桌面的远程共享。 sudo apt install xrdpsudo systemctl start xrdp查看状态&#xff1a; sudo systemctl status xrdp ● xrdp.service - xrdp d…

el-table表头添加说明

1、el-table-column添加render-header 2、编写render函数 renderTipsHeader(h, { column }, item) {return h(span,[h(span, column.label),h(el-tooltip,{props:{effect:dark,content:item.headertip,placement:top},},[h(i, {class:el-icon-question,style:color:#C0C4CC;mar…

【AI论文】MultiFinBen:一个用于金融大语言模型评估的多语言、多模态且具备难度感知能力的基准测试集

摘要&#xff1a;近期&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的进展加速了金融自然语言处理&#xff08;NLP&#xff09;及其应用的发展&#xff0c;然而现有的基准测试仍局限于单语言和单模态场景&#xff0c;往往过度依赖简单任务&#xff0c;无法反映现实世界…

使用 .NET Core+GcExcel,生成 Excel 文件

引言 在当今数字化办公和数据处理的大环境下&#xff0c;在线生成 Excel 文件成为了许多企业和开发者的需求。.NET Core 作为一个跨平台的开源框架&#xff0c;具有高效、灵活等特点&#xff0c;而 GcExcel 是一款功能强大的 Excel 处理组件。将二者结合&#xff0c;可以方便地…

【代码解析】opencv 安卓 SDK sample - 1 - HDR image

很久没有写安卓了&#xff0c;复习复习。用的是官方案例&#xff0c;详见opencv-Android-sdk 包 // 定义包名&#xff0c;表示该类的组织路径 package org.opencv.samples.tutorial1;// 导入所需的OpenCV和Android类库 import org.opencv.android.CameraActivity; // OpenCV…

Web中间件性能调优指南:线程池、长连接与负载均衡的最佳实践

目录 引言一、Web容器线程池配置不当1.1 线程池参数的核心作用与影响1.2 线程池大小计算模型1.3 动态调优实践 二、Keep-Alive机制配置缺陷2.1 Keep-Alive的工作原理2.2 典型配置问题与影响2.3 优化配置建议 三、负载均衡策略缺失3.1 负载均衡的核心价值3.2 主流负载均衡算法对…

15个AI模拟面试平台 和 简历修改 / 真人面试平台

对15个AI模拟面试平台的详细分析&#xff0c;每个平台都将按照统一的框架进行评估。 补充重要的&#xff1a; 【1】AMA interview 听说最好&#xff0c;最贵 1. Final Round AI 网址: https://www.finalroundai.com/ 功能深度剖析: Final Round AI 提供了一套全面的求职工具…

开始使用 Elastic AI Assistant for Observability 和阿里 Qwen3

这篇文章是继之前的文章 “在本地电脑中部署阿里 Qwen3 大模型及连接到 Elasticsearch” 的续篇。如果你还没有部署好自己的 Qwen3&#xff0c;那么请阅读之前的那篇文章来安装好环境&#xff0c;然后再继续今天练习。在今天的文章中&#xff0c;我们将展示如何结合 Qwn3 和 El…

稳定币技术全解:从货币锚定机制到区块链金融基础设施

引言&#xff1a;稳定币的技术定位 根据国际清算银行&#xff08;BIS&#xff09;2025年定义&#xff1a;稳定币是以法定资产或算法机制维持价值稳定的区块链代币&#xff0c;其本质是传统金融与加密技术的接口层。 核心价值&#xff1a;解决加密货币波动性问题 → 成为DeFi生态…

syncthing忘记密码怎么办(Mac版)?

一、问题描述 syncthing安装在Mac端&#xff0c;更改原同步文件夹的路径&#xff0c;需要重新设计同步文件&#xff0c;设置了密码且忘记密码。未看见忘记密码的选项。 网上查询解决方案&#xff0c;发现只能通过修改配置文件才能继续正常访问。但是并没有在建议路径中找到配置…

半导体FAB中的服务器硬件故障监控与预防全方案:从预警到零宕机实战

&#x1f4ca; 服务器硬件故障监控与预防全方案&#xff1a;从预警到零宕机实战 关键词&#xff1a;SMART监控 RAID预警 IPMI传感器 性能基线 Prometheus Zabbix 高可用架构 一、硬件故障前的7大预警信号&#xff08;附关联工具&#xff09; 故障类型关键指标监控工具预警阈值…

一分钟了解Transformer

一分钟了解Transformer A Minute to Know About Transformer By JacksonML 1. Transformer是什么&#xff1f; Transformer模型是一种神经网络&#xff0c;它通过学习上下文及其含义&#xff0c;跟踪序列数据中&#xff08;如本句中的单词&#xff09;中的关系。Transforme…

【Ubuntu学习】嵌入式编译工具链熟悉与游戏移植

目录 一、Ubuntu 系统编译 MININIM 源码 1. 环境准备与依赖配置 2. 编译 Allegro5.2.5 引擎 ​编辑 3. 编译 MININIM 源码 4. 故障解决 5. 打包与迁移 二、嵌入式平台编译实践 1. 树莓派 3B 编译 MININIM 2. Android 平台交叉编译 三、树莓派 3B 流水灯实验&#xf…

川翔云电脑全新上线:三维行业高效云端算力新选择

一、核心定位与优势 云端虚拟工作站服务 依托云端高性能 CPU/GPU 集群&#xff0c;提供远程桌面服务&#xff0c;支持普通设备运行专业软件。 按需付费模式&#xff1a;无需采购高端硬件&#xff0c;大幅降低成本投入。生态协同优势&#xff1a;与渲染 101 同属母公司&#…

百面Bert

百面Bert Q1. Bert与Transformer有什么关系 Bert是基于Transformer架构中的Encoder进行搭建的。 具体来说&#xff0c;Bert的核心组件是几个Encoder layer的堆叠。Encoder layer中&#xff0c;也是两个子层&#xff0c;分别是注意力层和intermediate层&#xff08;Bert中的叫…

Docker Compose与私有仓库部署

目录 一. Docker 重启策略 二. Docker Compose工具的应用 1. 什么是 Docker compose 2. Docker compose 的安装 3. 编辑文件格式及编写注意事项 4. docker-compose的基本用法 三. Harbor私有仓库 1. 什么是Harbor 2. Harbor 的优势 3. Harbor 的构成 四. 部署Harbor…

数字隔离器,如何扛起现代智能家电的电气安全“大旗”

随着现代社会生活节奏的不断加速&#xff0c;人们对于属于自己的休闲时间愈发珍视&#xff0c;而智能家居作为提升人类居家幸福感与舒适度的现代化产物&#xff0c;不仅能有效满足人们对高品质生活的追求&#xff0c;还能推动产业升级与经济增长&#xff0c;引导智能家电设备从…

mybatis3调用瀚高procedure报错(APP)

文章目录 环境文档用途详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;4.5 文档用途 mybatis3调用瀚高procedure报错&#xff08;错误信息&#xff1a;调用过程请使用CALL&#xff09;的解决方案。 详细信息 客户项目中使用…

96道Docker 容器高频题整理(附答案背诵版)

简述什么是 Docker 容器&#xff1f; Docker容器是一个开源的应用容器引擎&#xff0c;它让开发者可以将他们的应用以及依赖包打包到一个可移植的容器中&#xff0c;然后发布到任何安装了Docker引擎的服务器上&#xff0c;包括流行的Linux机器、Windows机器等。Docker容器利用…

成都芯谷金融中心·文化科技园打造文化科技高地

成都芯谷金融中心正式启动运营&#xff0c;标志着双流区集成电路产业生态圈的关键拼图落位。该项目以"文化科技金融"融合发展为核心理念&#xff0c;旨在构筑服务区域实体经济的创新引擎。 核心战略定位与区域价值 产业赋能枢纽&#xff1a;深度聚焦集成电路、新型…