Qt创建那个XML文档,并且对它实现查找,更新,插入等操作
2011-10-14 11:35
585 查看
转载于: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文件中,将界面设计如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201110/21f26fcbd958fe92ce72f86245bc4720.jpg)
其中用到的部件有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上进行输出。运行程序,单击按键,效果如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201110/4a96a7a4a789b85e341059ba424496a5.jpg)
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写入其中。运行程序,效果如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201110/6fbfafbffe2375c5b3697dc12ca2249c.jpg)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201110/a720de0e55cead918c57571c12ace79e.jpg)
我们先添加一个节点,然后再查看全部信息,发现确实已经添加成功了。
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,然后点击“查找”按键,效果如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201110/3fd5cedd8cf14cfd0b7e2414215f176b.jpg)
这时我们将下面的“书名”和“作者”进行更改,然后单击“更新”按键,效果如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201110/dfde4d5369d56838b7f7d19054bf8381.jpg)
再次点击“查找”按键:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201110/54ab47b5125edea006dc6a767ba1b2b5.jpg)
然后点击“删除”按键:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201110/f00300502064a23e31c38924dad4095b.jpg)
再点击“查看全部信息”按键:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201110/8f33f049db746597ce0a1a62e3dacde5.jpg)
我们发现,所有的操作的结果都是正确的。
该程序源代码:http://download.csdn.net/detail/addfourliu/3683056
首先,我们新建Qt4 Gui empty工程,工程名为BookInformation
1.为了在程序中可以使用中文,我们先在main.cpp文件中添加头文件:
#include <QTextCodec>
然后在main()函数中添加一行代码:
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
2.然后到BookInfo.ui文件中,将界面设计如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201110/21f26fcbd958fe92ce72f86245bc4720.jpg)
其中用到的部件有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上进行输出。运行程序,单击按键,效果如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201110/4a96a7a4a789b85e341059ba424496a5.jpg)
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写入其中。运行程序,效果如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201110/6fbfafbffe2375c5b3697dc12ca2249c.jpg)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201110/a720de0e55cead918c57571c12ace79e.jpg)
我们先添加一个节点,然后再查看全部信息,发现确实已经添加成功了。
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,然后点击“查找”按键,效果如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201110/3fd5cedd8cf14cfd0b7e2414215f176b.jpg)
这时我们将下面的“书名”和“作者”进行更改,然后单击“更新”按键,效果如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201110/dfde4d5369d56838b7f7d19054bf8381.jpg)
再次点击“查找”按键:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201110/54ab47b5125edea006dc6a767ba1b2b5.jpg)
然后点击“删除”按键:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201110/f00300502064a23e31c38924dad4095b.jpg)
再点击“查看全部信息”按键:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201110/8f33f049db746597ce0a1a62e3dacde5.jpg)
我们发现,所有的操作的结果都是正确的。
相关文章推荐
- 这是一个关于XML文档的操作管理器XMLHelper类,类中包括XML文档的创建,文档节点和属性的读取,添加,修改,删除的方法功能的实现
- XML解析器可以读取、更新、创建、操作一个XML文档
- Mysql创建触发器实现不同表的插入、更新、删除操作
- java中利用dom4j对XML文档的创建、解析、查找、修改、保存等操作。
- C++链表的创建、插入、删除、查找、合并、排序、修改等操作的实现
- java实现创建链表以及插入节点,查找结点,删除节点等操作
- 创建可编辑的xml文档(之四) 删除、改名、插入操作
- 创建可编辑的xml文档(之四) 删除、改名、插入操作
- C语言实现双链表基本操作(创建、查找、插入、删除)
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- 创建可编辑的xml文档(之四) 删除、改名、插入操作 YAOTIEBING [翻译]
- 4、MongoDB集合里面文档的插入,查找,更新操作
- c语言:顺序表的实现(一) 创建,插入,删除,查找,输出等基本操作实现
- [Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档
- 单链表基本操作的实现--创建、插入、查找、删除
- oracle xmltype 创建 、插入、更新、查找
- 用C#操作office组件库实现word文档的创建及文字 表格 图片的插入
- ELK学习总结(2-4)bulk 批量操作-实现多个文档的创建、索引、更新和删除
- java中利用dom4j对XML文档的创建、解析、查找、修改、保存等操作。
- 关于链表结构的基本操作 c 实现 (创建,插入删除,反转,合并链表,查找,是否有环,链表相交情况)