Qt讀寫XML文件的方法詳解(含源碼+注釋)
更新時間:2022年10月21日 10:36:05 作者:lw只吃億點.
XML文件可以用來存儲項目中的數據,它相當于一個簡單的數據庫,下面這篇文章主要給大家介紹了關于Qt讀寫XML文件(含源碼+注釋)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
一、示例XML文件內容
下方為本文所使用的xml文件的內容
<?xml version="1.0" encoding="UTF-8"?> <root> <childNode1 attruKey="attriVal">childNode1 Val</childNode1> <childNode2 attruKey="attriVal"> <cChildNode1 shuxing1="1">cChildNode1 Val</cChildNode1> <cChildNode2 shuxing2="2">cChildNode2 Val</cChildNode2> </childNode2> </root>
二、XML文件的寫入
下方為XML文件寫入的源碼,其中代碼內容按順序如下:
- QDomDocument對象的創(chuàng)建和xml文件頭的添加
- 創(chuàng)建根節(jié)點
- 創(chuàng)建包含屬性和節(jié)點值的子節(jié)點
- 創(chuàng)建較為復雜的子節(jié)點(包含屬性和第三級節(jié)點)
- 寫入文件
//創(chuàng)建QDomDocument對象 QDomDocument xDoc; QDomProcessingInstruction inStruction; //寫入xml文件頭(xml版本信息和編碼信息) inStruction = xDoc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\""); xDoc.appendChild(inStruction); //創(chuàng)建根節(jié)點并將其添加到xDoc中 QDomElement root = xDoc.createElement("root"); xDoc.appendChild(root); //創(chuàng)建子節(jié)點1 QDomElement childNode1 = xDoc.createElement("childNode1"); //為子節(jié)點childNode1設置屬性及屬性值 childNode1.setAttribute("attruKey", "attriVal"); //! 為子節(jié)點childNode1添加節(jié)點值 //! 創(chuàng)建QDomText對象并設置其值 QDomText nodeVal = xDoc.createTextNode("childNode1 Val"); //使用QDomElement對象的節(jié)點,添加節(jié)點值需添加QDomText對象,否則有可能不顯示該值 childNode1.appendChild(nodeVal); //將子節(jié)點1添加到根節(jié)點中 root.appendChild(childNode1); //! 創(chuàng)建一個多級節(jié)點childNode2 //創(chuàng)建多級節(jié)點2 QDomElement childNode2 = xDoc.createElement("childNode2"); //為多級節(jié)點childNode2設置屬性及屬性值 childNode2.setAttribute("attruKey", "attriVal"); //創(chuàng)建多級節(jié)點的子節(jié)點1 QDomElement cChildNode1 = xDoc.createElement("cChildNode1"); //設置cChildNode1的屬性和值 cChildNode1.setAttribute("shuxing1", 1); //設置cChildNode1的節(jié)點值 cChildNode1.appendChild(xDoc.createTextNode("cChildNode1 Val")); //將cChildNode1節(jié)點添加到多級節(jié)點中 childNode2.appendChild(cChildNode1); //創(chuàng)建多級節(jié)點的子節(jié)點2 QDomElement cChildNode2 = xDoc.createElement("cChildNode2"); //設置cChildNode2的屬性和值 cChildNode2.setAttribute("shuxing2", 2); //設置cChildNode2的節(jié)點值 cChildNode2.appendChild(xDoc.createTextNode("cChildNode2 Val")); //將cChildNode2節(jié)點添加到多級節(jié)點中 childNode2.appendChild(cChildNode2); //將多級節(jié)點childNode2添加到根節(jié)點中 root.appendChild(childNode2); //指定xml文件路徑 QFile file("./xmlTest.xml"); //以只讀方式打開,并且會清空文件內容 if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return 0; //使用文本流寫入文件 QTextStream outputStream(&file); xDoc.save(outputStream, 4); //縮進四格 file.close();
三、XML文件的讀取
3.1 文件讀取源碼
下方為XML文件讀取的源碼,其中代碼內容按順序如下:
- 創(chuàng)建QDomDocument對象并打開文件添加其數據源
- 獲取根節(jié)點
- 讀取較為簡單的子節(jié)點(僅一個屬性和節(jié)點值)
- 讀取較為復雜的子節(jié)點(包含屬性和不同的)
//創(chuàng)建QDomDocument對象 QDomDocument xDoc; //指定讀取的xml文件路徑 QFile file("./xmlTest.xml"); //xml文件以只讀方式打卡 if (!file.open(QIODevice::ReadOnly)) return 0; //調用setContent函數設置數據源 if (!xDoc.setContent(&file)) { file.close(); return 0; } file.close(); //獲取xDoc中的QDomElement對象 QDomElement docElem = xDoc.documentElement(); //獲取docElem的根節(jié)點 QDomNode node = docElem.firstChild(); //!獲取第一個子節(jié)點,并讀取其屬性及其值 QDomElement childNode1 = node.toElement(); //獲取childNode1的屬性值 QString attri1 = childNode1.attribute("attruKey"); //獲取childNode1的節(jié)點值(既然設置節(jié)點值需要插入子節(jié)點,那么讀取也應讀取其子節(jié)點) QDomNode node1Child = childNode1.firstChild(); QString node1Val = node1Child.nodeValue(); //輸出屬性值和節(jié)點值 qDebug() << "第一個子節(jié)點的屬性值和節(jié)點值"; qDebug() << attri1 << node1Val; //將節(jié)點移至下一節(jié)點的位置 node = node.nextSibling(); //! 獲取第二個節(jié)點,并使用循環(huán)獲取其中的各值 QDomElement childNode2 = node.toElement(); qDebug() << "第二節(jié)點的讀取"; //獲取childNode1的屬性值 QString attri2 = childNode2.attribute("attruKey"); qDebug() << "第二節(jié)點的屬性值:" << attri2; //獲取第二節(jié)點中的第一子節(jié)點 QDomNode cChildNode = childNode2.firstChild(); while(!cChildNode.isNull()) { //獲取當前子節(jié)點的對象 QDomElement e = cChildNode.toElement(); if(!e.isNull()) { qDebug() << e.firstChild().nodeValue(); // the node really is an element. } //獲取下一節(jié)點元素 cChildNode = cChildNode.nextSibling(); }
3.2 讀取結果示例
下方為XML文件讀取輸出示例
總結
XML文件使用QDomDocument對象寫入和讀取時需要注意如下事項,在寫入時需要添加QDomText對象設置值;而在讀取時需要讀取其首個子節(jié)點,并獲取其中的值。(越復雜的文件結構,需要更復雜的代碼去讀和寫)
到此這篇關于Qt讀寫XML文件(含源碼+注釋)的文章就介紹到這了,更多相關Qt讀寫XML文件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
相關文章
解析C語言基于UDP協(xié)議進行Socket編程的要點
這篇文章主要介紹了C語言通過UDP協(xié)議進行Socket編程的要點,文中還提到了相關ARP與ICMP協(xié)議的作用,需要的朋友可以參考下2016-02-02C++調用C函數報錯無法解析的外部命令/無法解析的外部符號問題
這篇文章主要介紹了C++調用C函數報錯無法解析的外部命令/無法解析的外部符號問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08C++ new與malloc和delete及free動態(tài)內存管理及區(qū)別介紹
這篇文章主要介紹了深入理解C++中的new/delete和malloc/free動態(tài)內存管理,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12