【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文档相关推荐
- [Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档
[Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档 楼主 发表于 2013-5-21 22:00:51 | 查看: 475| 回复: 0 使用DOM创建和操作XML文档 版权声明 该 ...
- 分别使用dom和dom4j解析XML文档
1.dom和dom4j的特点 dom是基于XML的树结构来完成解析的.dom解析XML文档时,会根据读取的文档,构建一个驻留内存的树结构,然后就可以使用dom接口来对XML文档进行增删查改等操作.do ...
- C#来创建和读取XML文档 [转]
C#来创建和读取XML文档 [关键词]:XML 录入:小鱼之家 来源:http://fisher.xundain.com 时间:2005-3-3 23:41:54 点击:85次 扩展标记语言XML( ...
- 操作xml文档的常用方式
1.操作XML文档的两种常用方式: 1)使用XmlReader类和XmlWriter类操作 XmlReader是基于数据流的,占用极少的内存,是只读方式的,所以速度极快.只能采用遍历的模式查找数据节点 ...
- C#来创建和读取XML文档
扩展标记语言XML(eXtensible Markup Language),是由W3C组织制定的.做为用于替代HTML语言的一种新型的标记语言, XML内部有着很多基本标准,XML就是通过与这些相关标 ...
- VBS操作XML文档,拷贝结点 (转)
VBS操作XML文档,拷贝结点 (转) Dim xmlDoc,xmlRoot,xmlNode,lastNode,newNode Dim doc,docRoot,i,flag Dim strNodeNa ...
- 使用Libxml2操作XML文档
一.Libxml2介绍: Libxml2 是一个xml的c语言版的解析器,本来是为Gnome项目开发的工具,是一个基于MIT License的免费开源软件.它除了支持c语言版以外,还支持c++.PHP ...
- xmlDocument来操作xml文档
它的作用是解析xml文档,将其转换为对象,使你可以在程序中对其操作 例如如下的xml文档: <?xml version="1.0" encoding="utf-8& ...
- 第十三章、C#操作XML文档(XmlDocument、XmlNode、XmlAttribute、SelectSingleNode、SelectNodes、XmlNodeList)...
XML文档是一种通用的文档,这种文档既可以用.config作为后缀也可以用.xml作为后缀.XML文档主要由元素节点和节点的属性共同构成的.它有且仅有一个根节点,其他的节点全部都是根节点的子节点或者子 ...
最新文章
- 如何查看SharePoint未知错误
- 关于凸优化的一些简单概念
- php调用mysql查询结果_php - 在php脚本中处理select查询结果集
- 华为向全球发布AI数据库、分布式存储,跑分轻松拿世界第一
- php判断手机浏览器,php 获取 手机浏览器的信息 | 学步园
- 十、Linux网络管理续集
- 再说人行分数解读分的作用
- 【转】学习理论,注重细节
- Matlab里c2d命令,matlab中c2d如何将连续函数离散化
- CentOS之——CentOS 6.5 安装RTL8111/8168B PCI EXPRESS网卡并解决安装出现的问题
- win10系统禁用笔记本自带键盘的方法
- 2020 阿里、字节iOS面试题之Runtime相关问题2
- 电脑突然重启解决方案
- 超级账本基金会执行董事Daniela Barbosa:开源区块链已成主流
- 苹果手机怎么用计算机打出字,使用苹果手机的注意啦!iphone输入法不好用?这些使用技巧教给你...
- java 集合之Interface Map<K,V> HashMap实现类
- SpringBoot——关于banner
- 作文提升~老师整理的优美排比句太实用
- MT9V034摄像头学习笔记(二)
- 把http升级到https——生命不息,折腾不止
热门文章
- springmvc 中controller与jsp传值
- java13 InputStream,Reader
- python接口自动化测试面试题_Python 接口自动化测试实战
- c#对象集合去重_C# List 对象去重
- 多个ip对应的是同一个mac_Python3+Scapy安装使用 + 查询本机对应网卡,IP,MAC代码...
- 河南城建学院linux期末试题,河南城建学院Linux期末考试复习题
- 2013百度校园招聘-机器学习和数据挖掘工程师-笔试题
- 关于Xbox live及其在中国的使用
- Shell基础知识(三)
- Android初级教程Activity小案例(计算器乘法运算)