日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

【Qt】DOM创建和操作XML文档

發布時間:2024/4/24 asp.net 98 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Qt】DOM创建和操作XML文档 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

00. 目錄

文章目錄

    • 00. 目錄
    • 01. 概述
    • 02. 開發環境
    • 03. 創建XML文檔
    • 04. 讀取XML文檔
    • 05. 增加XML節點
    • 06. 查找、刪除、更新XML文檔
    • 07. 附錄

01. 概述

使用代碼來創建XML文檔,并且實現查找、更新、插入等操作。

02. 開發環境

Windows系統:Windows10

Qt版本:Qt5.15或者Qt6

03. 創建XML文檔

3.1 新建Qt Widgets應用,項目名稱為17XML,基類選擇QMainWindow,類名為MainWindow。

3.2 打開17XML.pro文件,添加xml模塊

QT += core gui xml

3.3 進入設計模式,往界面上添加Push Button,Label,Line Edit,List Widget等部件,設計界面如下圖所示。

3.4 mainwindow.cpp文件中構造函數實現如下:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);QFile file("test.xml");bool ret = file.open(QIODevice::WriteOnly | QIODevice::Truncate);if (!ret){qDebug() << "打開文件失敗";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("1");book.setAttributeNode(id);text = doc.createTextNode("Qt");title.appendChild(text);text = doc.createTextNode("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("2");book.setAttributeNode(id);text = doc.createTextNode("Linux");title.appendChild(text);text = doc.createTextNode("LiMing");author.appendChild(text);book.appendChild(title);book.appendChild(author);root.appendChild(book);QTextStream out(&file);doc.save(out, 4);file.close();}

里先使用QDomDocument類在內存中生成了一棵DOM樹,然后調用save()函數利用QTextStream文本流將DOM樹保存在了文件中。在生成DOM樹時主要使用了createElement()等函數來生成各種節點,然后使用appendChild()將各個節點依次追加進去。

執行程序之后,打開生成的text.xml文件內容如下

<?xml version="1.0" encoding="UTF-8"?> <書庫><圖書 編號="1"><書名>Qt</書名><作者>shiming</作者></圖書><圖書 編號="2"><書名>Linux</書名><作者>LiMing</作者></圖書> </書庫>

04. 讀取XML文檔

讀取整個文檔的內容,并顯示在List Widget部件上面,這里用的就是上一節講到的內容。我們從設計模式進入“查看全部信息”按鈕單擊信號槽,更改如下:

//查看全部信息 void MainWindow::on_pushButton_5_clicked() {//清空內容ui->listWidget->clear();QFile file("test.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();} }

執行程序,結果如下:

05. 增加XML節點

5.1 首先在設計模式,把書名和作者標簽后面的Line Edit部件的objectName分別更改為lineEdit_title和lineEdit_author。

5.2 進入添加按鈕的單擊信號槽,添加如下代碼:

//添加按鈕 void MainWindow::on_pushButton_3_clicked() {//我們先清空顯示,然后顯示“無法添加!”ui->listWidget->clear();ui->listWidget->addItem(tr("無法添加!"));QFile file("test.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("圖書");QDomAttr id = doc.createAttribute("編號");QDomElement title = doc.createElement("書名");QDomElement author = doc.createElement("作者");QDomText text;// 我們獲得了最后一個孩子結點的編號,然后加1,便是新的編號QString num = root.lastChild().toElement().attribute("編號");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寫入其中。運行程序,效果如下圖所示。

06. 查找、刪除、更新XML文檔

6.1 將界面上“圖書編號”后面的Line Edit部件的objectName更改為lineEdit_id。

6.2 在mainwindow.h文件中添加public類型的函數聲明:

void doXml(const QString operate);

6.3 到mainwindow.cpp中添加該函數的定義:

void MainWindow::doXml(const QString operate) {ui->listWidget->clear();ui->listWidget->addItem(tr("沒有找到相關內容!"));QFile file("test.xml");if (!file.open(QIODevice::ReadOnly)) return ;QDomDocument doc;if (!doc.setContent(&file)){file.close();return ;}file.close();QDomNodeList list = doc.elementsByTagName("圖書");// 以標簽名進行查找for(int i=0; i < list.count(); i++){QDomElement e = list.at(i).toElement();// 如果元素的“編號”屬性值與我們所查的相同if(e.attribute("編號") == ui->lineEdit_id->text()){// 如果元素的“編號”屬性值與我們所查的相同if(operate == "delete") //如果是刪除操作{QDomElement root = doc.documentElement(); //取出根節點root.removeChild(list.at(i)); //從根節點上刪除該節點QFile file("test.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("test.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());}}}} }

6.4 分別進入“查找”,“刪除”,“更新”三個按鈕的單擊信號槽,更改如下:

//查找 void MainWindow::on_pushButton_clicked() {doXml("find"); }//刪除 void MainWindow::on_pushButton_2_clicked() {doXml("delete"); }//更新 void MainWindow::on_pushButton_4_clicked() {doXml("update"); }

運行程序,查找操作結果如下圖所示。

對編號為1的圖書進行更新,效果如下圖所示。

更新后我們再次查看所有內容。如下圖所示。

然后進行刪除操作,如下圖所示。

刪除后再次查詢所有內容。效果如下圖所示。

溫馨提示

使用DOM可以很方便地進行XML文檔的隨機訪問,這也是它最大的優點。

07. 附錄

7.1 Qt教程匯總
網址:https://dengjin.blog.csdn.net/article/details/115174639

7.2 源碼下載
網址:【Qt】DOM創建和操作XML文檔.rar

總結

以上是生活随笔為你收集整理的【Qt】DOM创建和操作XML文档的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。