讀取和寫入json,xml文件

一、JSON文件操作?

1. 核心類??

??QJsonDocument??:表示整個JSON文檔,提供解析(fromJson())和序列化(toJson())功能。
??QJsonObject??:存儲鍵值對集合,支持嵌套對象和數組。
??QJsonArray??:存儲有序值列表。
??QJsonValue??:封裝JSON支持的數據類型(字符串、數字、布爾值等)

2. 讀寫操作?

讀取JSON文件??:

QFile file("config.json");
if (!file.open(QIODevice::ReadOnly)) 
{return; // 錯誤處理
}
// 讀取文件
QByteArray jsonStr = file.readAll();
// 關閉文件
file.close();// 將json字符串轉化為json文檔
QJsonDocument jsonDoc = QJsonDocument::format(jsonStr);// 將json文檔轉化為json對象
QJsonObject jsonObj = jsonDoc.object();// 獲取對應的數據,獲取的類型默認值為QJsonValue
jsonObj.value("鍵").to對應的類型轉化;

寫入JSON文件??:

// 創建json對象
QJsonObject rootObj;
// 插入內容
rootObj.insert("key","value");// 將json對象轉化為json文檔
QJsonDocument jsonDoc(jsonObj);
// 將json文檔轉化為json字符串
QByteArray jsonStr = jsonDoc.toJson(QJsonDocument::Compact);
// 打開文件
QFile file("相對路徑/絕對路徑");
if(!file.open(QIODevide::WriteOnly))
{return;// 錯誤處理
}
// 寫入json字符串
file.write(jsonStr);
// 關閉文件
file.close();

二、XML文件操作?

1. 兩種處理方式對比?

??方法適用場景???核心類?
DOM模型 ??小文件、需隨機訪問或修改QDomDocument, QDomNode
?? 流式處理??大文件、只需順序讀寫QXmlStreamReader/Writer

2. DOM模型示例

讀取XML??:

// 1、載入xml文檔
QDomDocument doc;QFile file("相對路徑/絕對路徑");if(!file.open(QIODevice::ReadOnly))
{qDebug() << "文件打開失敗";return;
}QString errorMsg;
int errorLine, errorColumn;
if(!doc.setContent(&file, &errorMsg, &errorLine, &errorColumn))
{qDebug() << "XML解析錯誤:" << errorMsg << "at line" << errorLine << "column" << errorColumn;file.close();return;
}qDebug() << "文件讀取成功";
file.close();// 2、讀取頭部信息
QDomNode head = doc.firstChild();
qDebug() << head.nodeName() << head.nodeType() << head.nodeValue();// 3、獲取根節點
QDomElement rootEle = doc.documentElement();
qDebug() << rootEle.nodeName() << rootEle.nodeType() << rootEle.nodeValue() << rootEle.tagName();// 4、獲取name標簽
QDomElement nameEle = rootEle.firstChild().toElement();
qDebug() << nameEle.nodeName() << nameEle.nodeType() << nameEle.nodeValue();
qDebug() << nameEle.tagName() << nameEle.text() << nameEle.attribute("id") << nameEle.attribute("height");// 循環son獲取數據
QDomElement sonEle = nameEle.nextSiblingElement("son");
QDomNode node = sonEle.firstChild();while (node.isElement()) 
{QDomElement temp = node.toElement();qDebug() << temp.text();node = temp.nextSiblingElement();
}

讀取XML表格:

QDomDocument doc;QFile file("相對路徑/絕對路徑");
if(!file.open(QIODevice::ReadOnly))
{qDebug() << "文件打開失敗";return;
}
qDebug() << doc.setContent(&file);//通過 elementsByTagName 來獲取標簽對象
QDomNodeList namels = doc.elementsByTagName("book-name");
QDomNodeList authorls = doc.elementsByTagName("author");
QDomNodeList pricels = doc.elementsByTagName("price");
QDomNodeList pubdatels = doc.elementsByTagName("publish-date");
// 設置表格大小
ui->tableWidget->setRowCount(namels.size());
ui->tableWidget->setColumnCount(4);
ui->tableWidget->setHorizontalHeaderLabels({"書名","作者","價格","出版日期"});// 因為 nameList、authorList等鏈表的長度是一樣的,所以使用一個循環即可
for(int i = 0;i < namels.size();i++)
{QDomElement nameEle = namels.at(i).toElement();qDebug() << nameEle.tagName() << nameEle.text();QDomElement authorEle = authorls.at(i).toElement();QDomElement priceEle = pricels.at(i).toElement();QDomElement pubdateEle = pubdatels.at(i).toElement();//ui->tableWidget->setItem(i,0,new QTableWidgetItem(nameEle.nextSiblingElement().text()));ui->tableWidget->setItem(i,0,new QTableWidgetItem(nameEle.text()));ui->tableWidget->setItem(i,1,new QTableWidgetItem(authorEle.text()));ui->tableWidget->setItem(i,2,new QTableWidgetItem(priceEle.text()));ui->tableWidget->setItem(i,3,new QTableWidgetItem(pubdateEle.text()));
}file.close();

寫入XML??:

// 1、在內存當中創建doc樹
// 1.1、創建一個空的dom樹
QDomDocument doc;// 1.2、創建頭部標簽
QDomProcessingInstruction head = doc.createProcessingInstruction("xml","version='1.0' encoding='utf-8'");
// 追加給dom樹
doc.appendChild(head);// 1.3、添加跟標簽
QDomElement rootEle = doc.createElement("root");
// 追加給dom樹
doc.appendChild(rootEle);// 1.4、向根標簽中添加子標簽
QDomElement userEle = doc.createElement("user");
rootEle.appendChild(userEle);// 向子標簽添加屬性
userEle.setAttribute("id","0101");
QDomText textEle = doc.createTextNode("張無忌");
userEle.appendChild(textEle);// 2、將doc樹寫入文件
QFile file("相對路徑/絕對路徑");
if(!file.open(QIODevice::WriteOnly))
{qDebug() << "文件打開失敗";return;
}
QTextStream out(&file);
doc.save(out,4);
file.close();

3. 流式處理示例?

讀取XML??:

// 載入xml文檔,并將節點都保存為“記號”
QFile file("相對路徑/絕對路徑");
if(!file.open(QIODevice::ReadOnly))
{qDebug() << "文件打開失敗";return;
}QXmlStreamReader reader;
reader.setDevice(&file);// 循環獲得標記
while(!reader.atEnd())
{// 找到下一個記號,并保存該記號的類型QXmlStreamReader::TokenType type = reader.readNext();if(type == QXmlStreamReader::StartDocument){qDebug() << reader.documentVersion() << reader.documentEncoding();}else if(type == QXmlStreamReader::StartElement){if(reader.attributes().hasAttribute("id")){QString id = reader.attributes().value("id").toString();qDebug() << QString("<%1 id=\"%2\">").arg(reader.name()).arg(id);}else {qDebug() << QString("<%1>").arg(reader.name());}}else if(type == QXmlStreamReader::EndElement){qDebug() << QString("</%1>").arg(reader.name());}else if(type == QXmlStreamReader::Characters && !reader.isWhitespace()){qDebug() << reader.text();}
}file.close();

寫入XML??:

// 1、使用寫入流綁定一個xml文件(目的就是向文件中寫入內容)
QFile file("相對路徑/絕對路徑");
if(!file.open(QIODevice::WriteOnly))
{qDebug() << "文件打開失敗";return;
}QXmlStreamWriter writer(&file);// 2、向xml中寫入內容
// 實現自動格式化文檔
writer.setAutoFormatting(true);// 創建頭
// <?xml version="1.0" encoding="utf-8"?>
writer.writeStartDocument();// 創建第一個元素
// <user>
writer.writeStartElement("user");
// <name id="1001" height="175.8">于謙</name>
writer.writeStartElement("name");
writer.writeAttribute("id","1001");
writer.writeAttribute("height","175.8");
writer.writeCharacters("于謙");
writer.writeEndElement();// <isMarry>true</isMarry>
writer.writeTextElement("isMarray","true");// </user>
writer.writeEndElement();// 關閉文檔
writer.writeEndDocument();
// 3、關閉文件
file.close();

三、總結

  1. ??配置文件存儲??:
    JSON:適合結構簡單、需頻繁讀寫的配置(如用戶設置)。
    XML:適合復雜結構或需驗證的場景(如SOAP通信、文檔格式)。

  2. ??路徑管理??:
    外部文件路徑用QCoreApplication::applicationDirPath()獲取。

  3. ??版本兼容??:
    Qt 6移除了QJsonDocument::fromBinaryData(),優先使用文本格式

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915217.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915217.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915217.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度學習×第10卷:她用一塊小濾鏡,在圖像中找到你

&#x1f308;【第一節 她看到的是像素點&#xff0c;卻試圖拼出你整張臉】&#x1f4f8; 圖像是什么&#xff1f;她從未見過你&#xff0c;但看見的是你的一片光斑圖像&#xff0c;在神經網絡的眼里&#xff0c;是一個個數字格子。這些格子&#xff0c;每個都有 0~255 的亮度…

計算機組成原理中的RAM:核心技術深度解析

摘要&#xff1a;本文深度剖析RAM在計算機體系中的核心地位&#xff0c;結合2025年最新技術標準與實測數據&#xff0c;涵蓋DRAM工作原理、主流技術對比、非易失性存儲革新及未來發展趨勢&#xff0c;為硬件開發者和系統架構師提供權威技術參考。一、RAM基礎原理與系統交互機制…

C語言—深入理解指針(詳)

深入理解指針&#xff08;詳解&#xff09;前言一、指針是什么1、指針的定義2、指針的大小二、指針類型1、類型2、不同類型的意義三、野指針1、野指針形成原因2、如何避免野指針四、指針的運算1、 指針整數2、指針-指針3、指針的關系運算五、const修飾指針1、consr修飾變量2、c…

小談相機的學習過程

前言博主本人并非專職相機開發&#xff0c;還涉及系統的其他幾個模塊&#xff0c;雖然都屬于owner&#xff0c;但是都還在學習探索的一個過程&#xff0c;自認為掌握還不夠細致&#xff0c;此篇文章僅梳理&#xff0c;總結&#xff0c;印證自己近五年相機模塊的一個學習過程&am…

CentOS7 內網服務器yum修改

1、首先確定的內網服務器是有yum源代理服務器的2、修改 /etc/yum.conf 配置文件&#xff0c;增加代理ip和端口號proxyhttp://ip.ip.ip.ip:port3、備份源是文件sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak4、修改配置文件 vi CentOS-Base…

基于單片機自行車自動防盜報警系統設計

摘 要 本文闡述了自行車防盜報警系統原理&#xff0c;介紹如何用stc89c52單片機實現防盜報警&#xff0c;分析各個部分的工作原理&#xff0c;并給出了原理圖和源程序。此設計電路由震動傳感器、單片機、無線超再生發射/接收電路、LED顯示器和蜂鳴器組成。由于超再生接收是一種…

【深度學習】神經網絡反向傳播算法-part4

七、反向傳播算法反向傳播Back Propagation 簡稱 BP 。 訓練神經網絡的核心算法之一&#xff0c;通過計算損失函數&#xff0c;相對于每個權重參數的梯度&#xff0c;來優化神經網絡的權重1. 前向傳播前向傳播是把數據經過各層神經元的運算并逐層向前傳輸&#xff0c;知道輸出層…

CTF之服務器端模板注入(SSTI)與賽題

概念定義服務器端模板注入(Server-Side Template Injection)服務端接受攻擊者的輸入&#xff0c;將其作為Web應用內容的一部分&#xff0c;在進行代碼編譯渲染的過程中&#xff0c;進行了語句的拼接&#xff0c;執行了所插入的惡意內容&#xff0c;從而導致信息泄露、代碼執行、…

除了某信,就是這款軟件來替代了!

引言 哈嘍&#xff0c;我是小索奇。有時候會有一個普遍的需求&#xff0c;想在幾個設備之間傳個文件或者發個消息&#xff0c;除了微信&#xff0c;想一想你還能用什么軟件&#xff1f; 今天就是為了解決這個問題&#xff0c;給大家介紹一款軟件 Localsend 來解決。 內容模塊…

Vue2.x封裝預覽PDF組件

一、為什么用PDFObject插件&#xff1f; PDFObject 是一個輕量級的 JavaScript 庫&#xff0c;主要用于在網頁中嵌入和預覽 PDF 文件。它通過簡單的 API 調用&#xff0c;可以在瀏覽器中實現 PDF 文件的顯示&#xff0c;而無需依賴任何插件。以下將詳細介紹 PDFObject 的特點、…

undefined reference to ‘end‘

相關問題&#xff1a; 一、undefined reference to _exit undefined reference to ‘end‘ warning: _close is not implemented and will always fail 一、環境&#xff1a; ubuntu24.04實體機、 arm-none-eabi-gcc gcc version 13.2.1 20231009 (15:13.2.rel1-2) 二…

nginx定制http頭信息

修改http響應頭信息&#xff0c;相關Nginx模塊&#xff1a;ngx_http_headers_moduleexpires語法&#xff1a;expires [modified] time;expires [modified] time;默認值&#xff1a;expires off;作用域&#xff1a;http, server, location, if in location用途&#xff1a;控制緩…

主機安全---開源wazuh安裝

Wazuh 簡介 Wazuh 是一款免費開源的終端安全監控平臺&#xff0c;支持威脅檢測、完整性監控、事件響應和合規性管理&#xff0c;適用于企業級安全運維場景。其核心組件包括&#xff1a; Wazuh Indexer&#xff1a;基于 OpenSearch 的日志存儲與檢索組件。Wazuh Server&#x…

GaussDB 數據庫架構師修煉(四) 備份容量估算

1 影響備份容量關鍵要素業務總數據量備份數據保留周期備份周期備份數據的壓縮比平均每天的新增數據量平均每天新增日志數據量2 備份容量的估算方法公式備份容量C &#xff1d; 自動全量備份容量C1 &#xff0b; 自動差量備份容量C2 &#xff0b; 自動日志歸檔 容量C3 &#xff…

《R for Data Science (2e)》免費中文翻譯 (第0章) --- Introduction

寫在前面 本系列推文為《R for Data Science (2e)》的中文翻譯版本。所有內容都通過開源免費的方式上傳至Github&#xff0c;歡迎大家參與貢獻&#xff0c;詳細信息見&#xff1a; Books-zh-cn 項目介紹&#xff1a; Books-zh-cn&#xff1a;開源免費的中文書籍社區 r4ds-zh-cn…

如何 ASP.NET Core 中使用 WebSocket

如何在 ASP.NET Core 中使用 WebSocket在現代 Web 應用程序中&#xff0c;WebSocket 連接非常流行且使用率極高。它可以幫助企業滿足數字環境需求&#xff0c;并處理來自最終用戶的實時數據。它還能提升生產力、輸出率和用戶體驗。如果您還沒有使用 WebSocket&#xff0c;那么您…

Python之--元組

定義是 Python 中內置的不可變序列。在 Python 中使用&#xff08;&#xff09;定義元組&#xff0c;元素與元素之間使用英文的逗號分隔。元組中只有一個元素的時候&#xff0c;逗號也不能省略。元組的創建方式&#xff08;1&#xff09;使用&#xff08;&#xff09;直接創建元…

工業相機GigE數據接口的優勢及應用

工業相機不同的數據接口適用的應用場景也不同&#xff0c;選擇合適的數據額接口&#xff0c;可大大提高效率。今天我們來看看常見的GigE接口的優勢及應用。基于GigE Vision標準的千兆以太網&#xff08;GigE&#xff09;相機通過提供快速、靈活且成本效益高的成像解決方案&…

【53】MFC入門到精通——MFC串口助手(二)---通信版(發送數據 、發送文件、數據轉換、清空發送區、打開/關閉文件),附源碼

文章目錄1 完整 功能展示2 添加控件變量及聲明2.1 添加控件及變量2.2 SerialPortDlg.h: 頭文件3 函數實現3.1 數據發送3.1.2 寫數據、字符串轉3.2 發送文件3.2.1 打開文件3.2.2 發送文件3.3 清空發送區4 完整MFC項目項下載1 完整 功能展示 串口通信助手 頁面展示&#xff0c;功…

算法學習筆記:27.堆排序(生日限定版)——從原理到實戰,涵蓋 LeetCode 與考研 408 例題

堆排序&#xff08;Heap Sort&#xff09;是一種基于二叉堆數據結構的高效排序算法&#xff0c;由計算機科學家 J. W. J. Williams 于 1964 年提出。它結合了選擇排序的思想和二叉堆的特性&#xff0c;具有時間復雜度穩定&#xff08;O (nlogn)&#xff09;、原地排序&#xff…