Qt學習之XML

江上舟發表於2019-01-15

XML介紹

XML的操作有兩種方式,及DOM(Document Object Model)和SAX(Simple API for XML)。
DOM的解析原理:一次性把XML檔案載入到記憶體,然後在記憶體中建立Document樹,對記憶體要求比較嚴格。缺點:不適合讀區大容量的XML檔案,容易導致記憶體溢位。
SAX的解析原理:載入一點,讀取一點,處理一點,提供大量虛擬函式,以事件的形式處理 XML 文件。應用程式必須提供處理器(回撥函式) 來從解析器獲得所謂XML事件,但是比DOM佔用的記憶體要少的多。缺點:SAX 很難修改資料,開發人員需要編寫一些複雜的程式碼。
目前Qt提供了對應於這兩種用於讀取、操作和編寫XML的實現類,分別是QDomDocument類和QXmlStreamReader類。
如果要使用XML時,需新增下行程式碼:
#include
並在.pro檔案中新增:
QT += xml

DOM

QDomDocument類

在這裡插入圖片描述
專案中涉及到的操作無非也就增刪改查,對應於XML檔案中相應標記的讀、寫和修改。

增加:建立節點,將其寫入xml檔案中。

XML中的說明對應QDomProcessingInstruction
XML中的元素對應QDomElement類
XML中的屬性對應QDomAttr類
XML中的文字對應QDomText類
QT中所有的Dom節點(說明、元素、屬性、文字),都是用QDomNode表示
1).定義文件:QDomDocument doc;
2).建立說明:QDomProcessingInstruction instruction = doc.createProcessingInstruction(“xml”, "version=“1.0” encoding=“UTF-8"”);
3).建立根節點:QDomElement root = doc.createElement("rootName " );
4).建立元素節點:QDomElement element = doc.createElement(“nodeName”);
5).新增元素節點到根節點:root. appendChild(element);
6).建立元素文字:QDomText nodeText=doc.createTextNode(“text”);
7).新增元素文字到元素節點:element. appendChild(nodeText);
8).建立元素屬性:QDomAttr id = doc.createAttribute(nodeAttribute);
9).新增元素屬性值:id.setValue(value);
在這裡插入圖片描述
上面是建立一個便籤節點,若要繼續新增便籤節點,則需要在已有節點後增加一個新節點,並重寫入XML檔案(QIODevice::Truncate)

載入、查詢便籤時要讀取XML文件中的節點資訊。

DOM實現方式是將整個文件當作一個物件來裝入記憶體進行處理,然後開發者可以訪問這個物件中的每一個節點,每一個節點對應XML檔案裡的一個標記。
1).設定整個文件內容,將xml文件內容解析為一個DOM樹:setContent(檔案)
2).讀取根節點:QDomElement root = doc.documentElement();
3).讀取第一個子節點:QDomNode node = root.firstChild();
4).讀取下一個子節點:node = node.nextSibling();
5).匹配結點標記:node.toElement().tagName() == “note”
6).讀取節點文字:no = childNode.toText().data();

刪除便籤時,要刪除相應的XML節點。

用到的主要函式為:root.removeChild(node); 但在刪除某個節點後要重寫整個檔案。

注:對xml檔案修改後一定要對file進行操作,如下:

        QFile file("my.xml");
        if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
            return;
        QTextStream out(&file);
        out.setCodec("UTF-8");
        //縮排4
        doc.save(out, 4, QDomNode::EncodingFromTextStream);
        file.close();

SAX

DOM原始碼:https://github.com/JeremyJie/XML-DOM

相關文章