Qt讀寫XML文件的方法詳解(含源碼+注釋)
一、示例XML文件內(nèi)容
下方為本文所使用的xml文件的內(nèi)容
<?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文件寫入的源碼,其中代碼內(nèi)容按順序如下:
- QDomDocument對象的創(chuàng)建和xml文件頭的添加
- 創(chuàng)建根節(jié)點(diǎn)
- 創(chuàng)建包含屬性和節(jié)點(diǎn)值的子節(jié)點(diǎn)
- 創(chuàng)建較為復(fù)雜的子節(jié)點(diǎn)(包含屬性和第三級節(jié)點(diǎn))
- 寫入文件
//創(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é)點(diǎn)并將其添加到xDoc中
QDomElement root = xDoc.createElement("root");
xDoc.appendChild(root);
//創(chuàng)建子節(jié)點(diǎn)1
QDomElement childNode1 = xDoc.createElement("childNode1");
//為子節(jié)點(diǎn)childNode1設(shè)置屬性及屬性值
childNode1.setAttribute("attruKey", "attriVal");
//! 為子節(jié)點(diǎn)childNode1添加節(jié)點(diǎn)值
//! 創(chuàng)建QDomText對象并設(shè)置其值
QDomText nodeVal = xDoc.createTextNode("childNode1 Val");
//使用QDomElement對象的節(jié)點(diǎn),添加節(jié)點(diǎn)值需添加QDomText對象,否則有可能不顯示該值
childNode1.appendChild(nodeVal);
//將子節(jié)點(diǎn)1添加到根節(jié)點(diǎn)中
root.appendChild(childNode1);
//! 創(chuàng)建一個多級節(jié)點(diǎn)childNode2
//創(chuàng)建多級節(jié)點(diǎn)2
QDomElement childNode2 = xDoc.createElement("childNode2");
//為多級節(jié)點(diǎn)childNode2設(shè)置屬性及屬性值
childNode2.setAttribute("attruKey", "attriVal");
//創(chuàng)建多級節(jié)點(diǎn)的子節(jié)點(diǎn)1
QDomElement cChildNode1 = xDoc.createElement("cChildNode1");
//設(shè)置cChildNode1的屬性和值
cChildNode1.setAttribute("shuxing1", 1);
//設(shè)置cChildNode1的節(jié)點(diǎn)值
cChildNode1.appendChild(xDoc.createTextNode("cChildNode1 Val"));
//將cChildNode1節(jié)點(diǎn)添加到多級節(jié)點(diǎn)中
childNode2.appendChild(cChildNode1);
//創(chuàng)建多級節(jié)點(diǎn)的子節(jié)點(diǎn)2
QDomElement cChildNode2 = xDoc.createElement("cChildNode2");
//設(shè)置cChildNode2的屬性和值
cChildNode2.setAttribute("shuxing2", 2);
//設(shè)置cChildNode2的節(jié)點(diǎn)值
cChildNode2.appendChild(xDoc.createTextNode("cChildNode2 Val"));
//將cChildNode2節(jié)點(diǎn)添加到多級節(jié)點(diǎn)中
childNode2.appendChild(cChildNode2);
//將多級節(jié)點(diǎn)childNode2添加到根節(jié)點(diǎn)中
root.appendChild(childNode2);
//指定xml文件路徑
QFile file("./xmlTest.xml");
//以只讀方式打開,并且會清空文件內(nèi)容
if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
return 0;
//使用文本流寫入文件
QTextStream outputStream(&file);
xDoc.save(outputStream, 4); //縮進(jìn)四格
file.close();
三、XML文件的讀取
3.1 文件讀取源碼
下方為XML文件讀取的源碼,其中代碼內(nèi)容按順序如下:
- 創(chuàng)建QDomDocument對象并打開文件添加其數(shù)據(jù)源
- 獲取根節(jié)點(diǎn)
- 讀取較為簡單的子節(jié)點(diǎn)(僅一個屬性和節(jié)點(diǎn)值)
- 讀取較為復(fù)雜的子節(jié)點(diǎn)(包含屬性和不同的)
//創(chuàng)建QDomDocument對象
QDomDocument xDoc;
//指定讀取的xml文件路徑
QFile file("./xmlTest.xml");
//xml文件以只讀方式打卡
if (!file.open(QIODevice::ReadOnly))
return 0;
//調(diào)用setContent函數(shù)設(shè)置數(shù)據(jù)源
if (!xDoc.setContent(&file)) {
file.close();
return 0;
}
file.close();
//獲取xDoc中的QDomElement對象
QDomElement docElem = xDoc.documentElement();
//獲取docElem的根節(jié)點(diǎn)
QDomNode node = docElem.firstChild();
//!獲取第一個子節(jié)點(diǎn),并讀取其屬性及其值
QDomElement childNode1 = node.toElement();
//獲取childNode1的屬性值
QString attri1 = childNode1.attribute("attruKey");
//獲取childNode1的節(jié)點(diǎn)值(既然設(shè)置節(jié)點(diǎn)值需要插入子節(jié)點(diǎn),那么讀取也應(yīng)讀取其子節(jié)點(diǎn))
QDomNode node1Child = childNode1.firstChild();
QString node1Val = node1Child.nodeValue();
//輸出屬性值和節(jié)點(diǎn)值
qDebug() << "第一個子節(jié)點(diǎn)的屬性值和節(jié)點(diǎn)值";
qDebug() << attri1 << node1Val;
//將節(jié)點(diǎn)移至下一節(jié)點(diǎn)的位置
node = node.nextSibling();
//! 獲取第二個節(jié)點(diǎn),并使用循環(huán)獲取其中的各值
QDomElement childNode2 = node.toElement();
qDebug() << "第二節(jié)點(diǎn)的讀取";
//獲取childNode1的屬性值
QString attri2 = childNode2.attribute("attruKey");
qDebug() << "第二節(jié)點(diǎn)的屬性值:" << attri2;
//獲取第二節(jié)點(diǎn)中的第一子節(jié)點(diǎn)
QDomNode cChildNode = childNode2.firstChild();
while(!cChildNode.isNull()) {
//獲取當(dāng)前子節(jié)點(diǎn)的對象
QDomElement e = cChildNode.toElement();
if(!e.isNull()) {
qDebug() << e.firstChild().nodeValue(); // the node really is an element.
}
//獲取下一節(jié)點(diǎn)元素
cChildNode = cChildNode.nextSibling();
}
3.2 讀取結(jié)果示例
下方為XML文件讀取輸出示例

總結(jié)
XML文件使用QDomDocument對象寫入和讀取時需要注意如下事項(xiàng),在寫入時需要添加QDomText對象設(shè)置值;而在讀取時需要讀取其首個子節(jié)點(diǎn),并獲取其中的值。(越復(fù)雜的文件結(jié)構(gòu),需要更復(fù)雜的代碼去讀和寫)
到此這篇關(guān)于Qt讀寫XML文件(含源碼+注釋)的文章就介紹到這了,更多相關(guān)Qt讀寫XML文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
相關(guān)文章
解析C語言基于UDP協(xié)議進(jìn)行Socket編程的要點(diǎn)
這篇文章主要介紹了C語言通過UDP協(xié)議進(jìn)行Socket編程的要點(diǎn),文中還提到了相關(guān)ARP與ICMP協(xié)議的作用,需要的朋友可以參考下2016-02-02
C++調(diào)用C函數(shù)報錯無法解析的外部命令/無法解析的外部符號問題
這篇文章主要介紹了C++調(diào)用C函數(shù)報錯無法解析的外部命令/無法解析的外部符號問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
C++ new與malloc和delete及free動態(tài)內(nèi)存管理及區(qū)別介紹
這篇文章主要介紹了深入理解C++中的new/delete和malloc/free動態(tài)內(nèi)存管理,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12

