Qt創建那個XML文檔,並且對它實現查找,更新,插入等操作

轉載於:http://www.diybl.com/course/3_program/c++/qt/20110830/559158.html

該程序源代碼:http://download.csdn.net/detail/addfourliu/3683056


首先,我們新建Qt4 Gui empty工程,工程名爲BookInformation

1.爲了在程序中可以使用中文,我們先在main.cpp文件中添加頭文件:

#include <QTextCodec>

然後在main()函數中添加一行代碼:

QTextCodec::setCodecForTr(QTextCodec::codecForLocale());

2.然後到BookInfo.ui文件中,將界面設計如下:

其中用到的部件有Push Button,ListWidget,Label和Line Edit 。

3.我們再到BookInfo.cpp文件中,添加頭文件:#include <QtXml>

然後在構造函數中添加代碼如下:

QFile db("my.xml");
if(!db.open(QIODevice::WriteOnly | QIODevice::Truncate)) return ;
//只寫方式打開,並清空以前的信息
QDomDocument doc;
QDomElement root = doc.createElement("書庫");
doc.appendChild(root); //添加根元素

//添加第一個book元素及其子元素
QDomElement book = doc.createElement("圖書");
QDomAttr id = doc.createAttribute("編號");
QDomElement title = doc.createElement("書名");
QDomElement author = doc.createElement("作者");
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("圖書");
id = doc.createAttribute("編號");
title = doc.createElement("書名");
author = doc.createElement("作者");
id.setValue("2");
book.setAttributeNode(id);
text = doc.createTextNode("Linux");
title.appendChild(text);
text = doc.createTextNode("yafei");
author.appendChild(text);
book.appendChild(title);
book.appendChild(author);
root.appendChild(book);

QTextStream out(&db);
out.setCodec("UTF-8");
doc.save(out,4);
db.close();

connect(btn_search, SIGNAL(clicked()), this, SLOT(searchInfo())); 
connect(btn_delete, SIGNAL(clicked()), this, SLOT(deleteInfo()));
connect(btn_update, SIGNAL(clicked()), this, SLOT(updateInfo()));
connect(btn_add, SIGNAL(clicked()), this, SLOT(addInfo()));

connect(btn_allInfo, SIGNAL(clicked()), this, SLOT(checkAllInfo()));


這樣我們就建立起了一個XML文檔,過程並不複雜,只要注意一下元素的父子關係就可以了。最後我們用save()函數將數據從doc中保存到文件中。

4.下面我們讀取整個XML文檔,我們從BookInfo.ui中單擊“查看全部信息”按鈕,進入它的單擊事件槽函數,並更改如下:

void BookInfo::checkAllInfo()
{
Ui_MainWindow::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_MainWindow::listWidget->addItem(e.tagName()+e.attribute("編號"));
QDomNodeList list = e.childNodes();
for(int i=0; i<list.count(); i++)
{
QDomNode node = list.at(i);
if(node.isElement())
Ui_MainWindow::listWidget->addItem("  "+node.toElement().tagName()
+" : "+node.toElement().text());
}
}
n = n.nextSibling();  //下一個兄弟節點
}
}

這裏的代碼就是上一節我們講的讀取XML文檔所用的代碼,只是將以前的qDebug()輸出換成了在listWidget上進行輸出。運行程序,單擊按鍵,效果如下:

5.下面我們加入添加功能,進入“添加”按鍵的單擊事件槽函數,更改如下:

void BookInfo::addInfo()
{
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("圖書");
QDomAttr id = doc.createAttribute("編號");
QDomElement title = doc.createElement("書名");
QDomElement author = doc.createElement("作者");
QDomText text;
QString num = root.lastChild().toElement().attribute("編號");
int count = num.toInt() +1;
id.setValue(QString::number(count));
//我們獲得了最後一個孩子結點的編號,然後加1,便是新的編號
book.setAttributeNode(id);
text = doc.createTextNode(Ui_MainWindow::lineEdit_bookName->text());
title.appendChild(text);
text = doc.createTextNode(Ui_MainWindow::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_MainWindow::listWidget->clear(); //最後更改顯示爲“添加成功!”
Ui_MainWindow::listWidget->addItem("添加成功");
}

這裏先用只讀方式打開XML文件,將其讀入doc中,然後關閉。我們將新的節點加入到最後面,並使其“編號”爲以前的最後一個節點的編號加1。最後我們再用只寫的方式打開XML文件,將修改完的doc寫入其中。運行程序,效果如下:

我們先添加一個節點,然後再查看全部信息,發現確實已經添加成功了。

6.查找,刪除,更新操作。

因爲這三個功能都要先利用“編號”進行查找,所以我們放在一起實現。

我們先在BookInfo.h文件中添加一個函數聲明:

void doXml(const QString operate);

它有一個參數,用來傳遞所要進行的操作。

然後到BookInfo.cpp文件中對它進行定義:

void BookInfo::doXml(const QString operate)

{

Ui_MainWindow::listWidget->clear();
Ui_MainWindow::listWidget->addItem("沒有找到相關內容!");
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("圖書");
//以標籤名進行查找
for(int i=0; i<list.count(); i++)
{
QDomElement e = list.at(i).toElement();
if(e.attribute("編號") == Ui_MainWindow::lineEdit_num->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_MainWindow::listWidget->clear();
Ui_MainWindow::listWidget->addItem("刪除成功!");
}
else if(operate == "update")  //如果是更新操作
{
QDomNodeList child = list.at(i).childNodes();
//找到它的所有子節點,就是“書名”和“作者”
child.at(0).toElement().firstChild().setNodeValue(Ui_MainWindow::lineEdit_bookName->text());
//將它子節點的首個子節點(就是文本節點)的內容更新
child.at(1).toElement().firstChild().setNodeValue(Ui_MainWindow::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_MainWindow::listWidget->clear();
Ui_MainWindow::listWidget->addItem("更新成功!");
}
else if(operate == "find")  //如果是查找操作
{
Ui_MainWindow::listWidget->clear();
Ui_MainWindow::listWidget->addItem(e.tagName()+e.attribute("編號"));
QDomNodeList list = e.childNodes();
for(int i=0; i<list.count(); i++)
{
QDomNode node = list.at(i);
if(node.isElement())
Ui_MainWindow::listWidget->addItem("  "+node.toElement().tagName()
+" : "+node.toElement().text());
}
}
}
}

}

然後我們分別進入“查找”,“刪除”,“更新”三個按鍵的單擊事件槽函數,更改如下:

void BookInfo::searchInfo()
{
doXml("find");
}

void BookInfo::deleteInfo()
{
doXml("delete");
}

void BookInfo::updateInfo()
{
doXml("update");
}

這時,我們運行程序。

在“圖書編號”中輸入1,然後點擊“查找”按鍵,效果如下:

這時我們將下面的“書名”和“作者”進行更改,然後單擊“更新”按鍵,效果如下:

再次點擊“查找”按鍵:

然後點擊“刪除”按鍵:

再點擊“查看全部信息”按鍵:

我們發現,所有的操作的結果都是正確的。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章