转载请注明出处:http://blog.csdn.net/feng1790291543
Qt的xml篇:
建立Qt工程,使用的是GUI显示的。
本代码所使用的xml文件截图:
提供自己写的源码:
头文件部分------------------------------------------
widget010.h
#ifndef WIDGET010_H
#define WIDGET010_H
//#include <QWidget>
#include <QtCore>
#include <QtGui>
#include <QtXml/QtXml>
#include <QFile>
#include <string>
#include <stdlib.h>
namespace Ui {
class Widget010;
}
class Widget010 : public QWidget
{
Q_OBJECT
public:
explicit Widget010(QWidget *parent = 0);
~Widget010();
void doXml(const QString operate);
private:
Ui::Widget010 *ui;
private slots:
void on_listWidget_clicked(QModelIndex index);
void on_pushButtonUpdate_clicked(); //更新操作
void on_pushButtonDelete_clicked(); //删除操作
void on_pushButtonSelect_clicked(); //查询操作
void on_pushButtonAdd_clicked(); //添加操作
void on_pushButtonShowAll_clicked(); //显示所有数据操作
};
#endif // WIDGET010_H
源码部分-------------------------------------
widget010.cpp
#include "widget010.h"
#include "ui_widget010.h"
Widget010::Widget010(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget010)
{
ui->setupUi(this);
ui->listWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //设置选择动作
}
Widget010::~Widget010()
{
delete ui;
}
void Widget010::on_pushButtonShowAll_clicked()
{
ui->listWidget->clear();
QFile file("my.xml"); //定义文件实例,xml文件名为my.xml
qDebug()<<"hi,111";
QDomDocument doc;
bool flag1=file.open(QIODevice::ReadOnly); //以只读方式打开文件
qDebug()<<"7777777777777777777"<<flag1;
if(!flag1)
return ;
bool flag2=doc.setContent(&file); //将文件以doc 形式显示内容
qDebug()<<"8888888888888888888"<<flag2;
if(!flag2)
{
file.close();
return ;
}
file.close(); //关闭xml文件,
/***************************注:前面使用doc,是将操作文件的任务交给doc处理 ***********************/
QDomElement docElem=doc.documentElement();
QDomNode firstNode=docElem.firstChild();
while(!firstNode.isNull())
{
if(firstNode.isElement())
{
QDomElement firstElem=firstNode.toElement();
ui->listWidget->addItem(firstElem.tagName()+" "+firstElem.attribute("id"));
QDomNodeList listNode=firstElem.childNodes();
for(int i=0;i<listNode.count();i++) //从第一个节点开始,层层显示标签和元素内容
{
QDomNode node=listNode.at(i);
if(node.isElement())
ui->listWidget->addItem(" "+node.toElement().tagName()+" : "+node.toElement().text());
}
}
firstNode=firstNode.nextSibling();
}
}
void Widget010::on_pushButtonAdd_clicked()
{
ui->listWidget->clear();
ui->listWidget->addItem(QString("无法添加!"));
QFile file("my.xml"); //定义文件实例,xml文件名为my.xml
qDebug()<<"hi,111";
QDomDocument doc;
bool flag1=file.open(QIODevice::ReadOnly); //以只读方式打开文件
qDebug()<<"7777777777777777777"<<flag1;
if(!flag1)
return ;
bool flag2=doc.setContent(&file); //将文件以doc 形式显示内容
qDebug()<<"8888888888888888888"<<flag2;
if(!flag2)
{
file.close();
return ;
}
file.close(); //关闭xml文件,
/***************************注:前面使用doc,是将操作文件的任务交给doc处理 ***********************/
QDomElement root=doc.documentElement();
QDomElement book=doc.createElement("book");
QDomAttr id=doc.createAttribute("id");
QDomElement title=doc.createElement("title");
QDomElement author=doc.createElement("author");
QDomText text;
QString num=root.lastChild().toElement().attribute("id"); //子节点元素的添加,id是元素属性的自增操作
int count=num.toInt()+1;
id.setValue(tr("0")+QString::number(count));
book.setAttributeNode(id);
text=doc.createTextNode(ui->lineEditBookName->text());
title.appendChild(text);
text=doc.createTextNode(ui->lineEditBookMaker->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);
file.close();
ui->listWidget->clear();
ui->listWidget->addItem("添加成功.");
}
void Widget010::doXml(const QString operate) //查、删、更新操作方法
{
ui->listWidget->clear();
ui->listWidget->addItem("没有找到相关内容.");
QFile file("my.xml"); //定义文件实例,xml文件名为my.xml
qDebug()<<"hi,111";
QDomDocument doc;
bool flag1=file.open(QIODevice::ReadOnly); //以只读方式打开文件
qDebug()<<"7777777777777777777"<<flag1;
if(!flag1)
return ;
bool flag2=doc.setContent(&file); //将文件以doc 形式显示内容
qDebug()<<"8888888888888888888"<<flag2;
if(!flag2)
{
file.close();
return ;
}
file.close(); //关闭xml文件,
/***************************注:前面使用doc,是将操作文件的任务交给doc处理 ***********************/
QDomNodeList list=doc.elementsByTagName("book");
for(int i=0;i<list.count();i++)
{
QDomElement e=list.at(i).toElement();
if(e.attribute("id")==ui->lineEditBookNum->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("删除成功.");
}
else if(operate=="update")
{
QDomNodeList child=list.at(i).childNodes();
child.at(0).toElement().firstChild().setNodeValue(ui->lineEditBookName->text());
child.at(1).toElement().firstChild().setNodeValue(ui->lineEditBookMaker->text());
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("更新成功.");
}
else if(operate=="find") //查询
{
ui->listWidget->clear();
ui->listWidget->addItem(e.tagName()+e.attribute("id"));
QDomNodeList listNode=e.childNodes();
for(int i=0;i<listNode.count();i++)
{
QDomNode node=listNode.at(i);
if(node.isElement())
ui->listWidget->addItem(" "+node.toElement().tagName()+":"+node.toElement().text());
}
}
}
}
}
void Widget010::on_pushButtonSelect_clicked() //查询操作
{
doXml("find");
}
void Widget010::on_pushButtonDelete_clicked() //删除操作
{
doXml("delete");
}
void Widget010::on_pushButtonUpdate_clicked() //更新操作
{
doXml("update");
}
void Widget010::on_listWidget_clicked(QModelIndex index) //点击选择listwidget中某个记录,在lineEdit中相关的显示
{
if(!ui->listWidget->isItemSelected(ui->listWidget->currentItem())) //首先判断时候被选上,否则退出
return ;
QFile file("my.xml"); //定义文件实例,xml文件名为my.xml
qDebug()<<"hi,111";
QDomDocument doc;
bool flag1=file.open(QIODevice::ReadOnly); //以只读方式打开文件
qDebug()<<"7777777777777777777"<<flag1;
if(!flag1)
return ;
bool flag2=doc.setContent(&file); //将文件以doc 形式显示内容
qDebug()<<"8888888888888888888"<<flag2;
if(!flag2)
{
file.close();
return ;
}
file.close(); //关闭xml文件,
/***************************注:前面使用doc,是将操作文件的任务交给doc处理 ***********************/
int curRow=ui->listWidget->currentIndex().row(); //获取当前行数
QDomElement root=doc.documentElement(); //定义根元素
if(curRow<0) //如果内容显示为空,则退出
{
return;
}
QListWidgetItem *itemTaget=ui->listWidget->item(curRow);
QListWidgetItem *itemName=ui->listWidget->item(curRow+1);
QListWidgetItem *itemMaker=ui->listWidget->item(curRow+2); //获取当前项,本xml是设置第一个节点有两个元素,故,有三项
if(itemTaget->text().contains("book")) //只有当选中项的内容含有“book”字符串的,进行显示
{
ui->lineEditTaget->setText(itemTaget->text().right(3)); //其中是对字符串进行截取显示
}
if(itemMaker->text().contains("author")) //同上
ui->lineEditBookMaker->setText(itemMaker->text().right(itemMaker->text().size()-11));//同上
if(itemName->text().contains("title")) //同上
ui->lineEditBookName->setText(itemName->text().right(itemName->text().size()-10)); //同上
}