天天看點

Qt如何利用DOM類實作讀取xml檔案

作者:音視訊開發老舅

一、項目介紹

利用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萬元”

五、效果示範

完整結果如下:

Qt如何利用DOM類實作讀取xml檔案