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