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
英文地址,請注明出處:http://en.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;深度聚焦集成電路、新型…