![qt讀寫XML資料[DOM方式].doc_第1頁](http://file.renrendoc.com/FileRoot1/2020-1/9/a6e48a76-9423-4825-a871-a2ed8c3f1bd3/a6e48a76-9423-4825-a871-a2ed8c3f1bd31.gif)
![qt讀寫XML資料[DOM方式].doc_第2頁](http://file.renrendoc.com/FileRoot1/2020-1/9/a6e48a76-9423-4825-a871-a2ed8c3f1bd3/a6e48a76-9423-4825-a871-a2ed8c3f1bd32.gif)
![qt讀寫XML資料[DOM方式].doc_第3頁](http://file.renrendoc.com/FileRoot1/2020-1/9/a6e48a76-9423-4825-a871-a2ed8c3f1bd3/a6e48a76-9423-4825-a871-a2ed8c3f1bd33.gif)
![qt讀寫XML資料[DOM方式].doc_第4頁](http://file.renrendoc.com/FileRoot1/2020-1/9/a6e48a76-9423-4825-a871-a2ed8c3f1bd3/a6e48a76-9423-4825-a871-a2ed8c3f1bd34.gif)
![qt讀寫XML資料[DOM方式].doc_第5頁](http://file.renrendoc.com/FileRoot1/2020-1/9/a6e48a76-9423-4825-a871-a2ed8c3f1bd3/a6e48a76-9423-4825-a871-a2ed8c3f1bd35.gif)
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
qt讀寫XML資料DOM方式我們可以看到,如果所要讀取的XML文件不是很大,采用DOM讀取方法還是很便捷的,由于我用的也是DOM樹讀取的方法,所以,本文所介紹的也主要是基于DOM的方法讀取。根據(jù)常用的操作,我簡單的把對(duì)XML的操作分為以下幾類:1 首先對(duì)XML文件進(jìn)行操作,打開文件。這個(gè)其實(shí)就是對(duì)文件進(jìn)行操作,可以把它直接定義為構(gòu)造函數(shù),在對(duì)對(duì)象進(jìn)行初始化時(shí)完成。TopoDataReader:TopoDataReader(const wstring &filePath):_filePath(filePath),_qDomDoc(mydocument),_qFile(QString:fromStdWString(filePath)if (!_qFile.open(QIODevice:ReadOnly)return;if (!_qDomDoc.setContent(&_qFile)_qFile.close();return;2 讀取XML文件中的節(jié)點(diǎn)內(nèi)容假設(shè)XML文件格式如下(1)(2)211.87.235.136對(duì)于第一種情況,采用如下方法:QDomElement docElem = _qDomDoc.documentElement();QDomNode nodeswitch=docElem.elementsByTagName(switch );/紅色的為標(biāo)簽名QDomElement elemnodeswitch=nodeswitch.toElement();string snmpip=qPrintable(elemnodeswitch.attribute(snmpip);/network的也是如此方法獲取對(duì)于第二種情況,采用如下方法:直接調(diào)用text() API就可以了string ip=qPrintable(elementnodeip.text();但是,假設(shè)文件中有多個(gè)同樣的節(jié)點(diǎn),如下這樣用elementsByTagName(b)返回的就是一個(gè)childNodes()而不是一個(gè)單獨(dú)的node了。我們可以使用at()方法具體定位。另外,我們還可以使用這樣一種方法獲取節(jié)點(diǎn)的值,假設(shè)XML文件如下- +前端主交換機(jī)- 192.168.120.251public120truetruetrue050.050.0161trueCZ-5_FAtopLeft我們可以先獲取switch節(jié)點(diǎn),然后得到其childNodes(),于是就可以使用at()方法來獲取下面的每個(gè)節(jié)點(diǎn)了(注:從0開始)比如說,上面的那個(gè)ip節(jié)點(diǎn)就是nodeswitch.childNodes().at(3)。這樣做得好處就是不用擔(dān)心重復(fù)的問題,只要你確定switch節(jié)點(diǎn)確定對(duì)了,底下的也就一定能確定了。3 返回某個(gè)節(jié)點(diǎn)下子節(jié)點(diǎn)的個(gè)數(shù)這個(gè)簡單,也是直接調(diào)APIQDomElement docElem = _qDomDoc.documentElement();QDomNode nodetagname=docElem.elementsByTagName(tagname).at(0);/假設(shè)有多個(gè)tagname此處選第一個(gè)int num=nodetagname.childNodes().size();好了,臨時(shí)想起來就這么多。以后想起來再添。/=Qt學(xué)習(xí)之XML讀寫操作小結(jié)2010年05月25日 評(píng)論(0)|瀏覽(315)點(diǎn)擊查看原文Qt學(xué)習(xí)之XML讀寫操作小結(jié)在“QQ便簽”項(xiàng)目組中我負(fù)責(zé)有關(guān)后臺(tái)XML操作的實(shí)現(xiàn)部分,現(xiàn)在對(duì)在項(xiàng)目中用到的XML的相關(guān)操作進(jìn)行簡單的小結(jié)。這幾天搜集qt對(duì)XML格式文件的讀寫,著重于DOM這種方式,先將搜集的資料粘貼在下面, 以一個(gè)完整的流程:=如下:=我們知道對(duì)XML的操作有兩種方法,即DOM方式和SAX方式。二者主要區(qū)別是:DOM實(shí)現(xiàn)方式操作非常簡單,但不適合處理過大文件;而SAX實(shí)現(xiàn)方式是能處理很大的XML文件,但是需要開發(fā)者寫一些復(fù)雜的代碼。Qt提供了對(duì)應(yīng)于這兩種用于讀取、操作和編寫XML的實(shí)現(xiàn)類,分別是QDomDocument類和QXmlStreamReader類,由于在項(xiàng)目中涉及的文件不大,因此我們選用QDomDocument類來處理。項(xiàng)目中涉及便簽的增刪改查,對(duì)應(yīng)于XML文件中相應(yīng)標(biāo)記的讀、寫和修改,下面分別介紹:1. 創(chuàng)建節(jié)點(diǎn),將其寫入XML文件,主要操作包括:QDomDocument doc;1).創(chuàng)建根節(jié)點(diǎn):QDomElement root = doc.documentElement(rootName );2).創(chuàng)建元素節(jié)點(diǎn):QDomElement element = doc.createElement_x(nodeName);3).添加元素節(jié)點(diǎn)到根節(jié)點(diǎn):root. appendChild(element);4).創(chuàng)建元素文本:QDomText nodeText=doc.createTextNode(text);5).添加元素文本到元素節(jié)點(diǎn):element. appendChild(nodeText);在本項(xiàng)目中,假設(shè)便簽的屬性有序號(hào)、名字、內(nèi)容、字體、字號(hào)、顏色、粗細(xì)、斜體、下劃線這幾項(xiàng),則在文件中添加一個(gè)便簽節(jié)點(diǎn)的操作如下:QDomDocument doc;instruction = doc.createProcessingInstruction(xml,version=1.0 encoding=UTF-8);doc.appendChild(instruction);QDomElement root = doc.createElement_x(Notes);doc.appendChild(root);QDomElement note = doc.createElement_x(note);root.appendChild(note);QDomElement no = doc.createElement_x(no);note.appendChild(no);.QDomText no_text = doc.createTextNode(001);.則得到一個(gè)便簽節(jié)點(diǎn),將其保存到test.xml文件中,代碼如下:QFile file(test.xml);if (!file.open(QIODevice:WriteOnly | QIODevice:Truncate |QIODevice:Text)return ;QTextStream out(&file);out.setCodec(UTF-8);doc.save(out,4,QDomNode:EncodingFromTextStream);file.close();則test.xml文件:0012010-05-10(13:53:24)A meeting!Script MT Bold16 #00ffff0truetrue上面是創(chuàng)建一個(gè)便簽節(jié)點(diǎn),若要繼續(xù)添加便簽節(jié)點(diǎn),則需要在已有節(jié)點(diǎn)后增加一個(gè)新節(jié)點(diǎn),并重寫入XML文件。2. 加載、查找便簽時(shí)要讀取XML文檔中的節(jié)點(diǎn)信息,DOM實(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)記。主要操作包括:1).讀取根節(jié)點(diǎn):QDomElement root = doc.documentElement();2).讀取第一個(gè)子節(jié)點(diǎn):QDomNode node = root.firstChild();3).讀取下一個(gè)子節(jié)點(diǎn):node = node.nextSibling();4).匹配結(jié)點(diǎn)標(biāo)記:node.toElement().tagName() = note5).讀取節(jié)點(diǎn)文本:no = childNode.toText().data();/=遍歷節(jié)點(diǎn)=可以通過doc.childNodes()獲得doc的所有的子節(jié)點(diǎn)列表QDomNodeList。比如QDomNodeList list=doc.childNodes();for(int i=0;ilist.count();i+)QDomNode node=list.at(i);/好的風(fēng)格當(dāng)然是把定義寫在外面:(/qDebug()”node name is “node.nodeName();/qDebug()”node type is “.nodeType();/=以下是項(xiàng)目中讀取便簽屬性的函數(shù)實(shí)現(xiàn)代碼:void MainWindow:parseAttr(const QDomElement &element)QString no,name,content,font,fontSize,color;QDomNode node = element.firstChild();while (!node.isNull() if (node.toElement().tagName() = note) /匹配note節(jié)點(diǎn)parseAttr(node.toElement(); else if (node.toElement().tagName() = no)/匹配屬性noQDomNode childNode = node.firstChild();if (childNode.nodeType() = QDomNode:TextNode) no = childNode.toText().data();else if (node.toElement().tagName() = name) /匹配屬性name.node = node.nextSibling();/讀取兄弟節(jié)點(diǎn)3. 刪除便簽時(shí),要?jiǎng)h除相應(yīng)的XML節(jié)點(diǎn),用到的主要函數(shù)為:root.removeChild(node); 但在刪除某個(gè)節(jié)點(diǎn)后要重寫整個(gè)文件。以上對(duì)XML文件的重寫操作是必須的,因此在文件的打開方式中要加上QIODevice:Truncate,表示覆蓋重寫。目前還沒有找到可以直接修改文件的方法,但若文件很大的情況下,必須考慮相應(yīng)的效率問題。由于本項(xiàng)目在啟動(dòng)時(shí)需要將所有便簽加載到內(nèi)存,因此選用DOM方式比較合適,但如果處理的XML文件很大,而且不需要全部讀到內(nèi)存時(shí),可以用SAX實(shí)現(xiàn)方式,它按階段將文檔讀取到內(nèi)存中,在碰到標(biāo)簽或者其它階段的時(shí)候,可以調(diào)用開發(fā)者預(yù)先設(shè)計(jì)好的回調(diào)函數(shù)去處理,這樣效率比DOM方式更高。4.讀取XML文件內(nèi)容:/=打開document=add me =QString xmlPath = filename.xml;QFile file(xmlPath);if (!file.open(QFile:ReadOnly | QFile:Text)return ;QString errorStr;int errorLine;int errorColumn;QDomDocument doc;if (!doc.setContent(&file, false, &errorStr, &errorLine, &errorColumn)return ;file.close();/也可以用doc.setContent(&file)帶一個(gè)參數(shù)就行。/=然后按照上面方式遍歷數(shù)據(jù),修改后在以上面相同的方式寫入到XML文件中。/=附加一段代碼 創(chuàng)建XML文件=int main( int argc, char *argv )QApplication a( argc, argv );QString xmlPath = InitInfo.xml;QFile file(xmlPath);if (!file.open(QFile:ReadOnly | QFile:Text)return 1;QString errorStr;int errorLine;int errorColumn;QDomDocument doc;if (!doc.setContent(&file, false, &errorStr, &errorLine, &errorColumn)return 1;file.close();QDomElement root = doc.documentElement();QString str = root.tagName();if (root.tagName() != Root)return 1;QDomElement element =doc.createElement_x(device3);element.setAttribute(ChildName,Content);QDomElement el_address = doc.createElement_x(Content );el_address.setAttribute(key,equipmentname);el_address.setAttribute(value,CSC101B);el_address.setAttribute(name,裝置名稱);/QDomText text_address = doc.createTextNode(key);/el_address.appendChild(text_address);element.appendChild(el_address);QDomElement el_path = doc.createElement_x(path);QDomText text_path = doc.createTextNode(aa);el_path.appendChild(text_path);element.appendChild(el_path);root.appendChild(element);QFile f(xmlPath);if (!f.open(QFile:WriteOnly | QFi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- DB32/T 1259-2020翠柏茶加工技術(shù)規(guī)程
- DB32/T 1086-2022高速公路建設(shè)項(xiàng)目檔案管理規(guī)范
- DB31/T 946-2015綠色產(chǎn)業(yè)園區(qū)評(píng)價(jià)導(dǎo)則
- DB31/T 935-2015車載信息服務(wù)汽車經(jīng)銷商信息服務(wù)管理規(guī)范
- DB31/T 918-2015城鎮(zhèn)生活垃圾填埋場(chǎng)植被生態(tài)重建技術(shù)要求
- DB31/T 903-2015便攜式纏繞瓶定期檢驗(yàn)與評(píng)定
- DB31/T 568-2018人身保險(xiǎn)業(yè)窗口服務(wù)規(guī)范
- DB31/T 518-2010省際客運(yùn)車輛車載視頻監(jiān)控系統(tǒng)基本技術(shù)要求
- DB31/T 346-2013地理標(biāo)志產(chǎn)品南匯水蜜桃
- DB31/T 1368-2022重點(diǎn)產(chǎn)品質(zhì)量攻關(guān)成果評(píng)價(jià)要求
- 小型設(shè)備購買協(xié)議書
- 2025年農(nóng)村宅基地房屋買賣合同樣本
- 難點(diǎn)02:總集篇·十六種陰影部分面積法【十六大考點(diǎn)】-2024年小升初數(shù)學(xué)典型例題系列(解析版)
- 廠房設(shè)備拆除協(xié)議書
- 2025屆高三高考押題預(yù)測(cè)卷 數(shù)學(xué)(新高考Ⅱ卷02) 含解析
- 智能家居安裝與調(diào)試協(xié)議
- 擔(dān)保貸款免責(zé)協(xié)議書
- 租金折抵欠款協(xié)議書
- 2025年人機(jī)交互領(lǐng)域考試題及答案
- 2025年全科衛(wèi)生資格考試試題及答案
- 2025年中考英語沖刺模擬試卷-山西省適用-教師版
評(píng)論
0/150
提交評(píng)論