Qt使用QDomDocument操作XML文件
本文介紹的是在Qt使用QDomDocument類實現XML文件的操作,QDomNode類是一個父類,QDomDocument是QDomNode的一個子類,鑒于大部分QDomNode的類型都是QDomDocument。
XML,全稱為擴展標記語言(extensible markup language).是一種非常方便的數據交換工具。現在Blog的訂閱系統輸出格式就是滿足XML規范的RSS格式,還有SVG矢量圖形也使用了XML格式。
我們在取得一個XML格式的文件后,需要作句法分析去提取發布方提供的信息。而Qt為XML提供了很好的支持,包括DOM的實現和SAX的實現。
DOM是Document Object Model的簡稱,其實現方式是將整個文檔當作一個對象來裝入內存進行處理,然后開發者可以訪問這個對象中的每一個節點,每一個節點對應XML文件里的一個標記。這種方式的優點是操作非常簡單,缺點是需要將整個文件放入內存,不適合處理過大文件。這種方式在Qt中的實現類是QDomDocument,也是本文將要講解的。以Blog為代表的RSS文件都不會很大,適合用這種方式來處理。
SAX是Simple API for XML的簡稱,其實現方式是按階段將文檔讀取到內存中,在碰到標簽或者其它階段的時候,調用開發者預先設計好的回調函數去處理。這種方式的缺點是需要開發者寫回調函數去處理不同標簽,代碼復雜一些,優點是能處理很大的XML文件。這種方式在Qt中的實現類叫QXmlStreamReader。
下面部分是代碼講解
(1)如果需要使用QDomDocument,那么請在你的項目.pro文件里加上一句”QT += xml”,不然無法編譯通過。
(2)
- QDomDocument doc;
- QFile file(”rss.xml”);
- QString errorStr;
- int errorLine;
- int errorCol;
- //setContent是將指定的內容指定給QDomDocument解析,***參數可以是QByteArray或者是文件名等
- if(!doc.setContent(&file,true,&errorStr,&errorLine,&errorCol))
- {
- //如果出錯,則會進入這里。errorStr得到的是出錯說明
- //errorLine和errorCol則是出錯的行和列
- }
如果上面的步驟沒出錯,那么恭喜你,你已經得到了一個完整的QDomDocument對象doc,你只要訪問doc的子節點或子子節點就可以取得XML中所有標記上的內容了。
(3)
可以通過doc.childNodes()獲得doc的所有的子節點列表QDomNodeList。比如
- QDomNodeList list=doc.childNodes();
- for(int i=0;i<list.count();i++){
- QDomNode node=list.at(i);//好的風格當然是把定義寫在外面:(
- //qDebug()<<”node name is “<<node.nodeName();
- //qDebug()<<”node type is “<<.nodeType();
- }
通過上面的方法你就能知道每個節點的名字和類型了,節點名字就是標記的名字。打印出來對照著xml文件看就很容易明白了。QDomNode類是一個父類,QDomDocument是QDomNode的一個子類,鑒于大部分QDomNode的類型都是QDomDocument.那么你可以使用toDocument()函數將QDomNode類型轉換成QDomDocument.
- QString text=node.toElement().text();
上面的語句可以將一個節點里的文本取出,也就是標記內的文本部分。使用該函數獲得的編碼就已經是unicode格式了,不需要再做轉換。
小結:對于Qt使用QDomDocument操作XML文件的內容講解完了,希望本篇文章對你有所幫助吧。
【編輯推薦】