一、項目介紹
利用DOM相關類讀取xml檔案。
Dom(Document Object Model,即文檔對象模型)把XML文檔轉換成應用程式可以周遊的樹形結構,這樣便可以随機通路其中的節點。它的缺點是需要将整個XML文檔讀入記憶體,消耗記憶體較多。
在Qt中使用QDomProcessingInstruction類來表示XML說明,元素對應QDomElement類,屬性對應QDomAttr類,文本内容由QDomText類表示。所有的DOM節點,比如這裡的說明、元素、屬性和文本等,都使用QDomNode類來表示,然後使用對應的isProcessingInstruction()、isElement()、isAttr()和isText()等函數來判斷是否是該類型的元素,如果是,那麼就可以使用toProcessingInstruction()、toElement()、toAttr()和toText()等函數轉換為具體的節點類型。
二、項目基本配置
建立一個Qt案例,項目名稱為“DomTest”,基類選擇“QWidget”,取消建立UI界面複選框的選中狀态,完成項目建立。
三、UI界面設計
無UI界面
四、主程式實作
4.1 node.xml
建立一個xml檔案,内容為:
<?xml version="1.0" encoding="UTF-8"?>
<archive>
<car id="1">
<attrib number="01" >排量:2393ml</attrib>
<attrib number="02" >價格:43.26萬元</attrib>
</car>
<car id="2" >
<attrib number="01" >排量:1600ml</attrib>
<attrib number="02" >價格:8.98萬元</attrib>
</car>
<car id="3" >
<attrib number="01" >排量:1600ml</attrib>
<attrib number="02" >價格:11.25萬元</attrib>
</car>
<car id="4" >
<attrib number="01" >排量:1997ml</attrib>
<attrib number="02" >價格:15.38萬元</attrib>
</car>
</archive>
QT開發交流+赀料君羊:661714027
4.2 pro檔案
在DomTest.pro檔案中添加如下代碼:
QT+=xml
4.3 main.cpp
核心代碼如下:
//建立QDomDocument類對象,它代表一個XML文檔
QDomDocument doc;
//建立指向“node.xml”檔案的QFile對象
QFile file("node.xml");
//以隻讀方式打開
if(!file.open(QIODevice::ReadOnly))
{
qDebug()<<"無法打開";
return 0;
}
//将檔案内容讀到doc中
QString errorMsg;
if(!doc.setContent(&file,&errorMsg))
{
qDebug()<<errorMsg;//如果讀取出錯則傳回錯誤類型
file.close();
return 0;
}
//關閉檔案
file.close();
//獲得doc的第一個節點,即XML說明
QDomNode firstNode=doc.firstChild();
//輸出XML說明
qDebug()<<firstNode.nodeName();
qDebug()<<firstNode.nodeValue();
運作結果:
“xml”
“version=‘1.0’ encoding=‘UTF-8’”
如果不希望看到引号,可以進行如下修改:
qDebug() << qPrintable(firstNode.nodeName());
qDebug()<< qPrintable(firstNode.nodeValue());
運作結果:
xml
version=‘1.0’ encoding=‘UTF-8’
查找id節點及其對應的名稱:
//如果節點不為空
while(!n.isNull())
{
if(n.isElement()) //如果節點是元素
{
QDomElement e=n.toElement();//将其轉換為元素
qDebug()<<e.tagName();//傳回元素标記
qDebug()<<e.attribute("id");//傳回元素id屬性的值
}
n=n.nextSibling(); //下一個兄弟節點
}
運作結果:
“car”
“1”
“car”
“2”
“car”
“3”
“car”
“4”
輸出所有子節點的内容:
//如果節點不為空
while(!n.isNull())
{
if(n.isElement()) //如果節點是元素
{
QDomElement e=n.toElement();//将其轉換為元素
QDomNodeList list=e.childNodes(); // 獲得元素e的所有子節點的清單
// 周遊該清單
for(int i=0;i<list.count();i++)
{
QDomNode node=list.at(i);
if(node.isElement())
qDebug()<<node.toElement().tagName();
qDebug()<<node.toElement().text();
}
}
n=n.nextSibling(); //下一個兄弟節點
}
QT開發交流+赀料君羊:661714027
這裡使用了childNodes()函數獲得了元素所有子節點的清單,然後通過周遊這個清單實作了周遊其所有子元素。運作結果:
“attrib”
“排量:2393ml”
“attrib”
“價格:43.26萬元”
“attrib”
“排量:1600ml”
“attrib”
“價格:8.98萬元”
“attrib”
“排量:1600ml”
“attrib”
“價格:11.25萬元”
“attrib”
“排量:1997ml”
“attrib”
“價格:15.38萬元”
五、效果示範
完整結果如下: