[Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档
生活随笔
收集整理的這篇文章主要介紹了
[Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
[Qt教程]?第28篇 XML(二)使用DOM創建和操作XML文檔
??|?查看: 475|?回復: 0| 使用DOM創建和操作XML文檔 版權聲明 該文章原創于作者yafeilinux,轉載請注明出處! 導語 在上一節中我們用手寫的方法建立了一個XML文檔,并且用DOM的方法對其進行了讀取。現在我們使用代碼來創建那個XML文檔,并且對它實現查找、更新、插入等操作。 環境:Windows Xp + Qt 4.8.4+QtCreator 2.6.2 目錄 一、創建文檔 二、讀取文檔 三、添加節點 四、查找、刪除、更新操作 正文 一、創建文檔 1.新建Qt Gui應用,項目名稱為myDom_2,基類為QMainWindow,類名為MainWindow。 2.完成后打開myDom_2.pro,然后將第一行代碼更改為: QT? ?? ??+= core??gui? ?xml 保存該文件。 3.雙擊mainwindow.ui進入設計模式,往界面上添加Push Button,Label,Line Edit,List Widget等部件,設計界面如下圖所示。 4.完成后,打開mainwindow.cpp文件,先包含頭文件#include?<QtXml>,然后在構造函數中添加如下代碼: QFile?file("my.xml"); //?只寫方式打開,并清空以前的信息 if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return ; QDomDocument?doc; QDomProcessingInstruction?instruction;??//添加處理指令 instruction = doc.createProcessingInstruction("xml","version=\"1.0\"encoding=\"UTF-8\""); doc.appendChild(instruction); QDomElement?root = doc.createElement(tr("書庫")); doc.appendChild(root); //添加根元素 //?添加第一個book元素及其子元素 QDomElement?book = doc.createElement(tr("圖書")); QDomAttr?id = doc.createAttribute(tr("編號")); QDomElement?title = doc.createElement(tr("書名")); QDomElement?author = doc.createElement(tr("作者")); QDomText?text; id.setValue(tr("1")); book.setAttributeNode(id); text = doc.createTextNode(tr("Qt")); title.appendChild(text); text = doc.createTextNode(tr("shiming")); author.appendChild(text); book.appendChild(title); book.appendChild(author); root.appendChild(book); //?添加第二個book元素及其子元素 book = doc.createElement(tr("圖書")); id = doc.createAttribute(tr("編號")); title = doc.createElement(tr("書名")); author = doc.createElement(tr("作者")); id.setValue(tr("2")); book.setAttributeNode(id); text = doc.createTextNode(tr("Linux")); title.appendChild(text); text = doc.createTextNode(tr("yafei")); author.appendChild(text); book.appendChild(title); book.appendChild(author); root.appendChild(book); QTextStream?out(&file); doc.save(out,4); //?將文檔保存到文件,4為子元素縮進字符數 file.close(); 這里先使用QDomDocument類在內存中生成了一棵DOM樹,然后調用save()函數利用QTextStream文本流將DOM樹保存在了文件中。在生成DOM樹時主要使用了createElement()等函數來生成各種節點,然后使用appendChild()將各個節點依次追加進去。 5.打開main.cpp文件,先包含頭文件:#include?<QTextCodec>,然后在main()函數第一行代碼后面添加如下代碼: QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8")); 6.運行程序,可以看到在構建目錄中生成了my.xml文件,可以雙擊查看該文件的內容,效果如下圖所示。 二、讀取文檔 下面我們讀取整個文檔的內容,并顯示在List Widget部件上面,這里用的就是上一節講到的內容。我們進入“查看全部信息”按鈕單擊信號槽,更改如下: void?MainWindow::on_pushButton_5_clicked() { ? ??ui->listWidget->clear(); //先清空顯示 ? ??QFile?file("my.xml"); ? ??if?(!file.open(QIODevice::ReadOnly))?return?; ? ??QDomDocument?doc; ? ??if?(!doc.setContent(&file)) ? ??{ ? ?? ??file.close(); ? ?? ??return?; ? ??} ? ? file.close(); ? ??//返回根節點及其子節點的元素標記名 ? ??QDomElement?docElem?=?doc.documentElement();??//返回根元素 ? ??QDomNode?n?=?docElem.firstChild();? ?//返回根節點的第一個子節點 ? ??while(!n.isNull())??//如果節點不為空 ? ??{ ? ?? ???if?(n.isElement())?//如果節點是元素 ? ?? ??{ ? ?? ?? ???QDomElement?e?=?n.toElement();?//將其轉換為元素 ? ?? ?? ???ui->listWidget->addItem(e.tagName() +e.attribute(tr("編號"))); ? ?? ?? ???QDomNodeList?list?=?e.childNodes(); ? ?? ?? ???for(int?i=0;?i<list.count();?i++) ? ?? ?? ???{ ? ?? ?? ?? ?? ??QDomNode?node?=?list.at(i); ? ?? ?? ?? ?? ??if(node.isElement()) ? ?? ?? ?? ?? ?? ??ui->listWidget->addItem("? ?" +node.toElement().tagName() ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?+" : "+node.toElement().text()); ? ?? ?? ???} ? ?? ??} ? ?? ??n?=?n.nextSibling();??//下一個兄弟節點 ? ??} } 運行程序,效果如下圖所示。 三、添加節點 1.首先在設計模式,把書名和作者標簽后面的Line Edit部件的objectName分別更改為lineEdit_title和lineEdit_author。如下圖所示。 ? 2.然后進入添加按鈕的單擊信號槽,添加如下代碼: void?MainWindow::on_pushButton_4_clicked() { ? ??ui->listWidget->clear();?//我們先清空顯示,然后顯示“無法添加!” ? ??ui->listWidget->addItem(tr("無法添加!")); ? ??QFile?file("my.xml"); ? ??if?(!file.open(QIODevice::ReadOnly))?return; ? ??QDomDocument?doc; ? ??if?(!doc.setContent(&file)) ? ??{ ? ?? ??file.close(); ? ?? ??return; ? ??} ? ??file.close(); ? ??QDomElement?root?=?doc.documentElement(); ? ??QDomElement?book?=?doc.createElement(tr("圖書")); ? ??QDomAttr?id?=?doc.createAttribute(tr("編號")); ? ??QDomElement?title?=?doc.createElement(tr("書名")); ? ??QDomElement?author?=?doc.createElement(tr("作者")); ? ??QDomText?text; ? ??//?我們獲得了最后一個孩子結點的編號,然后加1,便是新的編號 ? ??QString?num?=?root.lastChild().toElement().attribute(tr("編號")); ? ??int?count?=?num.toInt()?+1; ? ??id.setValue(QString::number(count)); ? ??book.setAttributeNode(id); ? ??text?=?doc.createTextNode(ui->lineEdit_title->text()); ? ??title.appendChild(text); ? ??text?=?doc.createTextNode(ui->lineEdit_author->text()); ? ??author.appendChild(text); ? ??book.appendChild(title); ? ??book.appendChild(author); ? ??root.appendChild(book); ? ??if(!file.open(QIODevice::WriteOnly?|?QIODevice::Truncate)) ? ?? ??return?; ? ??QTextStream?out(&file); ? ??doc.save(out,4);? ?//將文檔保存到文件,4為子元素縮進字符數 ? ??file.close(); ? ??ui->listWidget->clear();?//最后更改顯示為“添加成功!” ? ??ui->listWidget->addItem(tr("添加成功!")); } 這里先用只讀方式打開XML文件,將其讀入doc中,然后關閉。我們將新的節點加入到最后面,并使其“編號”為以前的最后一個節點的編號加1。最后我們再用只寫的方式打開XML文件,將修改完的doc寫入其中。運行程序,效果如下圖所示。 再次查看全部信息,可以看到新的節點已經添加了,如下圖所示。 四、查找、刪除、更新操作 因為這三個功能都要先利用“編號”進行查找,所以我們放在一起實現。 1.首先將界面上“圖書編號”后面的Line Edit部件的objectName更改為lineEdit_id。 2.在mainwindow.h文件中添加public類型的函數聲明: ? ??void?doXml(constQString?operate); 我們使用這個函數來完成三種不同的操作,根據參數來判斷不同的操作。 3.然后到mainwindow.cpp中添加該函數的定義: void?MainWindow::doXml(const?QString?operate) { ? ??ui->listWidget->clear(); ? ??ui->listWidget->addItem(tr("沒有找到相關內容!")); ? ??QFile?file("my.xml"); ? ??if?(!file.open(QIODevice::ReadOnly))?return?; ? ??QDomDocument?doc; ? ??if?(!doc.setContent(&file)) ? ??{ ? ?? ??file.close(); ? ?? ??return?; ? ??} ??file.close(); ? ??QDomNodeList?list?=?doc.elementsByTagName(tr("圖書")); ? ??//?以標簽名進行查找 ? ??for(int?i=0;?i<list.count();?i++) ? ??{ ? ?? ??QDomElement?e?=?list.at(i).toElement(); ? ?? ??//?如果元素的“編號”屬性值與我們所查的相同 ? ?? ??if(e.attribute(tr("編號"))?==?ui->lineEdit_id->text()) ? ?? ??{ ? ?? ?? ?? ?//?如果元素的“編號”屬性值與我們所查的相同 ? ?? ?? ???if(operate?==?"delete")??//如果是刪除操作 ? ?? ?? ???{ ? ?? ?? ?? ?? ??QDomElement?root?=?doc.documentElement();?//取出根節點 ? ?? ?? ?? ?? ??root.removeChild(list.at(i));??//從根節點上刪除該節點 ? ?? ?? ?? ?? ??QFile?file("my.xml");? ???//保存更改 ? ?? ?? ??if(!file.open(QIODevice::WriteOnly?|?QIODevice::Truncate)) ?return ; ? ?? ?? ?? ?? ??QTextStream?out(&file); ? ?? ?? ?? ?? ??doc.save(out,4); ? ?? ?? ?? ?? ??file.close(); ? ?? ?? ?? ?? ??ui->listWidget->clear(); ? ?? ?? ?? ?? ??ui->listWidget->addItem(tr("刪除成功!")); ? ?? ?? ???} ? ?? ?? ???else?if(operate?==?"update")??//如果是更新操作 ? ?? ?? ???{ ? ?? ?? ?? ?? ??QDomNodeList?child?=?list.at(i).childNodes(); ? ?? ?? ?? ?? ??//找到它的所有子節點,就是“書名”和“作者” ? ?? ?? ?? ?? ??child.at(0).toElement().firstChild().setNodeValue(ui->lineEdit_title->text()); ? ?? ?? ?? ?? ??//將它子節點的首個子節點(就是文本節點)的內容更新 ? ?? ?? ?? ?? ??child.at(1).toElement().firstChild().setNodeValue(ui->lineEdit_author->text()); ? ?? ?? ?? ?? ??QFile?file("my.xml");? ???//保存更改 ? ?? ?? ??if(!file.open(QIODevice::WriteOnly?|?QIODevice::Truncate)) ? ???return ; ? ?? ?? ?? ?? ??QTextStream?out(&file); ? ?? ?? ?? ?? ??doc.save(out,4);? ?//保存文檔,4為子元素縮進字符數 ? ?? ?? ?? ?? ??file.close(); ? ?? ?? ?? ?? ??ui->listWidget->clear(); ? ?? ?? ?? ?? ??ui->listWidget->addItem(tr("更新成功!")); ? ?? ?? ???} ? ?? ?? ???else?if(operate?==?"find")??//如果是查找操作 ? ?? ?? ???{ ? ?? ?? ?? ?? ??ui->listWidget->clear(); ? ?? ?? ?? ?? ??ui->listWidget->addItem(e.tagName()+e.attribute(tr("編號"))); ? ?? ?? ?? ?? ??QDomNodeList?list?=?e.childNodes(); ? ?? ?? ?? ?? ??for(int?i=0;?i<list.count();?i++) ? ?? ?? ?? ?? ?{ ? ?? ?? ?? ?? ?? ???QDomNode?node?=?list.at(i); ? ?? ?? ?? ?? ?? ???if(node.isElement()) ? ?? ?? ?? ?? ?? ?? ?? ?ui->listWidget->addItem("? ?"+node.toElement().tagName() ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?+" : "+node.toElement().text()); ? ?? ?? ?? ?? ??} ? ?? ?? ???} ? ?? ??} ? ??} } 4.?下面我們分別進入“查找”,“刪除”,“更新”三個按鈕的單擊信號槽,更改如下: //?查找 void?MainWindow::on_pushButton_clicked() {? ?? ? ? doXml("find"); } //?刪除 void?MainWindow::on_pushButton_2_clicked() {? ?? ? ?? ?doXml("delete"); } //?更新void? MainWindow::on_pushButton_3_clicked() {? ?? ? ?? ?doXml("update"); } 下面運行程序,查找操作結果如下圖所示。 然后對編號為1的圖書進行更新,效果如下圖所示。 更新后我們再次查看所有內容。如下圖所示。 然后進行刪除操作,如下圖所示。 刪除后再次查詢所有內容。效果如下圖所示。 結語 通過本節的例子可以看到使用DOM可以很方便的進行XML文檔的隨機訪問,這也是它最大的優點。關于更多更詳細的內容可以參考《Qt Creator快速入門》的相關章節。 涉及到的源碼:??myDom_2.zip?? |
總結
以上是生活随笔為你收集整理的[Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Qt教程] 第26篇 数据库(六)SQ
- 下一篇: 【Qt】XML简介