溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Qt如何利用DOM類實現(xiàn)讀取xml文件

發(fā)布時間:2022-06-17 14:05:36 來源:億速云 閱讀:378 作者:iii 欄目:開發(fā)技術

今天小編給大家分享一下Qt如何利用DOM類實現(xiàn)讀取xml文件的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    一、項目介紹

    利用DOM相關類讀取xml文件。

    Dom(Document Object Model,即文檔對象模型)把XML文檔轉換成應用程序可以遍歷的樹形結構,這樣便可以隨機訪問其中的節(jié)點。它的缺點是需要將整個XML文檔讀入內存,消耗內存較多。

    在Qt中使用QDomProcessingInstruction類來表示XML說明,元素對應QDomElement類,屬性對應QDomAttr類,文本內容由QDomText類表示。所有的DOM節(jié)點,比如這里的說明、元素、屬性和文本等,都使用QDomNode類來表示,然后使用對應的isProcessingInstruction()、isElement()、isAttr()和isText()等函數(shù)來判斷是否是該類型的元素,如果是,那么就可以使用toProcessingInstruction()、toElement()、toAttr()和toText()等函數(shù)轉換為具體的節(jié)點類型。

    二、項目基本配置

    新建一個Qt案例,項目名稱為“DomTest”,基類選擇“QWidget”,取消創(chuàng)建UI界面復選框的選中狀態(tài),完成項目創(chuàng)建。

    三、UI界面設計

    無UI界面

    四、主程序實現(xiàn)

    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>

    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的第一個節(jié)點,即XML說明
        QDomNode firstNode=doc.firstChild();
        //輸出XML說明
        qDebug()<<firstNode.nodeName();
        qDebug()<<firstNode.nodeValue();

    運行結果:

    “xml”
    “version=&lsquo;1.0&rsquo; encoding=&lsquo;UTF-8&rsquo;”

    如果不希望看到引號,可以進行如下修改:

    qDebug() << qPrintable(firstNode.nodeName());
    qDebug()<< qPrintable(firstNode.nodeValue());

    運行結果:

    xml
    version=&lsquo;1.0&rsquo; encoding=&lsquo;UTF-8&rsquo;

    查找id節(jié)點及其對應的名稱:

       //如果節(jié)點不為空
       while(!n.isNull())
       {
          if(n.isElement())  //如果節(jié)點是元素
          {
             QDomElement e=n.toElement();//將其轉換為元素
             qDebug()<<e.tagName();//返回元素標記
             qDebug()<<e.attribute("id");//返回元素id屬性的值
           }
             n=n.nextSibling();  //下一個兄弟節(jié)點
       }

    運行結果:

    “car”
    “1”
    “car”
    “2”
    “car”
    “3”
    “car”
    “4”

    輸出所有子節(jié)點的內容:

       //如果節(jié)點不為空
       while(!n.isNull())
       {
          if(n.isElement())  //如果節(jié)點是元素
          {
             QDomElement e=n.toElement();//將其轉換為元素
             QDomNodeList list=e.childNodes(); // 獲得元素e的所有子節(jié)點的列表
             // 遍歷該列表
             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();  //下一個兄弟節(jié)點
       }

    這里使用了childNodes()函數(shù)獲得了元素所有子節(jié)點的列表,然后通過遍歷這個列表實現(xiàn)了遍歷其所有子元素。運行結果:

    “attrib”
    “排量:2393ml”
    “attrib”
    “價格:43.26萬元”
    “attrib”
    “排量:1600ml”
    “attrib”
    “價格:8.98萬元”
    “attrib”
    “排量:1600ml”
    “attrib”
    “價格:11.25萬元”
    “attrib”
    “排量:1997ml”
    “attrib”
    “價格:15.38萬元”

    五、效果演示

    完整結果如下:

    Qt如何利用DOM類實現(xiàn)讀取xml文件

    以上就是“Qt如何利用DOM類實現(xiàn)讀取xml文件”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業(yè)資訊頻道。

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

    AI