#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtXml>
#include <QFile>
#include <QDebug>
#include <QMessageBox>
//DOM操作XML文件,增删改查,xml文件的生成创建
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->lineEdit_book_name->setText(tr("语文"));
ui->lineEdit_book_author->setText(tr("scott"));
//by txwtech
//程序启动自动生成xml文件
QDomDocument doc2;
//添加处理指令即xml说明
QDomProcessingInstruction qdomInstruction;
qdomInstruction=doc2.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\" ");
doc2.appendChild(qdomInstruction);
//添加根元素
QDomElement dom_root=doc2.createElement("书库");
doc2.appendChild(dom_root);
//添加第一个图书元素及其子元素的方法,by txwtech
QDomElement book=doc2.createElement("图书");//生存各种节点
QDomAttr id=doc2.createAttribute("编号");
QDomElement title=doc2.createElement("书名");
QDomElement author=doc2.createElement("作者");
QDomText qText;
id.setValue("1");
book.setAttributeNode(id);
qText=doc2.createTextNode("Qt");
title.appendChild(qText);
qText=doc2.createTextNode("shimi");
author.appendChild(qText);
book.appendChild(title);
book.appendChild(author);
dom_root.appendChild(book);
//添加第二个图书元素及其子元素的方法,by txwtech
book=doc2.createElement("图书");
id=doc2.createAttribute("编号");
title=doc2.createElement("书名");
author=doc2.createElement("作者");
id.setValue("2");
book.setAttributeNode(id);
qText=doc2.createTextNode("Linix");
title.appendChild(qText);
qText=doc2.createTextNode("txwtec");
author.appendChild(qText);
book.appendChild(title);
book.appendChild(author);
dom_root.appendChild(book);
QFile file("my2.xml");
if(!file.open(QIODevice::WriteOnly|QIODevice::Truncate))
{
return;
}
QTextStream out(&file);//
doc2.save(out,4);//把文档保存到文件,4为子元素缩进字符数
file.close();
}
void MainWindow::doXml(const QString operate)
{
ui->listWidget_xml_content->clear();
ui->listWidget_xml_content->addItem(tr("没有找到相关内容"));
QFile file("my2.xml");
if(!file.open(QIODevice::ReadOnly))
{
qDebug()<<tr("打开xml文件失败");
return;
}
QDomDocument doc2;
if(!doc2.setContent(&file))//解析为DOM树
{
qDebug()<<tr("解析为DOM树失败");
file.close();
return;
}
file.close();
//以标签名进行查找
QDomNodeList qList=doc2.elementsByTagName("图书");
for(int i=0;i<qList.count();i++)
{
QDomElement qdom_elem=qList.at(i).toElement();
if(qdom_elem.attribute("编号")==ui->lineEdit_book_id->text())//判断元素的“编号”属性值与实际查找的相同
{
if("find"==operate)//查找操作,by txwtech
{
ui->listWidget_xml_content->clear();
ui->listWidget_xml_content->addItem(qdom_elem.tagName()+qdom_elem.attribute("编号"));
QDomNodeList qlist=qdom_elem.childNodes();
for(int i=0;i<qlist.count();i++)
{
QDomNode node=qlist.at(i);
if(node.isElement())
ui->listWidget_xml_content->addItem(" "+node.toElement().tagName()+":"+node.toElement().text());
}
}
else if("update"==operate)//更新操作
{
QDomNodeList child=qList.at(i).childNodes();
//将节点的首个子子节点-文本节点的内容更新
child.at(0).toElement().firstChild().setNodeValue(ui->lineEdit_book_name->text());
child.at(1).toElement().firstChild().setNodeValue(ui->lineEdit_book_author->text());
QFile file("my2.xml");
if(!file.open(QIODevice::WriteOnly|QIODevice::Truncate)) //Truncate重写方式打开。介绍:https://www.cnblogs.com/txwtech/p/16583242.html
{
return;
}
QTextStream out(&file);
doc2.save(out,4);
file.close();
ui->listWidget_xml_content->clear();
ui->listWidget_xml_content->addItem(tr("更新成功"));
}
else if("delete"==operate)
{
//删除操作
QDomElement root=doc2.documentElement();
//从根节点删除该节点
root.removeChild(qList.at(i));
QFile file("my2.xml");
if(!file.open(QIODevice::WriteOnly|QIODevice::Truncate))
{
qDebug()<<tr("打开xml文件失败");
return;
}
//写入文件
QTextStream out(&file);
doc2.save(out,4);
file.close();
ui->listWidget_xml_content->clear();
ui->listWidget_xml_content->addItem(tr("删除成功"));
}
}
}
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_show_all_clicked()//读取xml文件
{
//清空控件的显示内容
ui->listWidget_xml_content->clear();
QFile file("my2.xml");
if(!file.open(QIODevice::ReadOnly))
{
qDebug()<<tr("打开文件失败");
return;
}
else
{
qDebug()<<tr("打开文件成功");
}
QDomDocument doc2;
if(!doc2.setContent(&file))
{
file.close();
qDebug()<<tr("设备file到Dom失败");
return;
}
file.close();
QDomElement docElem=doc2.documentElement();//获取文档对象模型doc2的元素
QDomNode qDom_n=docElem.firstChild();//获取第一个节点
//可参考:https://txwtech.blog.csdn.net/article/details/126275715?spm=1001.2014.3001.5502
//简单读取的方法
while(!qDom_n.isNull())
{
if(qDom_n.isElement())//判断第一个节点是否是元素
{
QDomElement elem=qDom_n.toElement();//如果是元素,则转换成元素
ui->listWidget_xml_content->addItem(elem.tagName()+elem.attribute("编号"));
QDomNodeList qdomList=elem.childNodes();//把子节点集合放入list
for(int i=0;i<qdomList.count();i++)
{
QDomNode qdomNode=qdomList.at(i);
if(qdomNode.isElement())
{
ui->listWidget_xml_content->addItem(" "+qdomNode.toElement().tagName()
+":" + qdomNode.toElement().text());
}
}
}
qDom_n=qDom_n.nextSibling();
}
}
void MainWindow::on_pushButton_add_clicked()//添加信息
{
ui->listWidget_xml_content->clear();
ui->listWidget_xml_content->addItem(tr("无法添加"));
QFile file2("my2.xml");
if(!file2.open(QIODevice::ReadOnly))
{
qDebug()<<tr("打开my2.xml失败");
}
QDomDocument doc2;
if(!doc2.setContent(&file2))//解析为DOM树
{
qDebug()<<tr("设置fiel2对象失败");
file2.close();
return;
}
file2.close();
QDomElement root=doc2.documentElement();
QDomElement book=doc2.createElement("图书");
QDomAttr id=doc2.createAttribute("编号");
QDomElement title=doc2.createElement("书名");
QDomElement author = doc2.createElement("作者");
QDomText dom_text;
//获取最后一个子节点的编号,然后加1,即新的编号
QT_DOM方式操作xml文件增删改查.rar
需积分: 5 181 浏览量
2022-08-13
16:48:52
上传
评论
收藏 1014KB RAR 举报
txwtech笛克特科
- 粉丝: 3w+
- 资源: 56
评论0