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文档相关推荐

  1. [Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档

    [Qt教程] 第28篇 XML(二)使用DOM创建和操作XML文档 楼主  发表于 2013-5-21 22:00:51 | 查看: 475| 回复: 0 使用DOM创建和操作XML文档 版权声明 该 ...

  2. 分别使用dom和dom4j解析XML文档

    1.dom和dom4j的特点 dom是基于XML的树结构来完成解析的.dom解析XML文档时,会根据读取的文档,构建一个驻留内存的树结构,然后就可以使用dom接口来对XML文档进行增删查改等操作.do ...

  3. C#来创建和读取XML文档 [转]

    C#来创建和读取XML文档  [关键词]:XML 录入:小鱼之家 来源:http://fisher.xundain.com 时间:2005-3-3 23:41:54 点击:85次 扩展标记语言XML( ...

  4. 操作xml文档的常用方式

    1.操作XML文档的两种常用方式: 1)使用XmlReader类和XmlWriter类操作 XmlReader是基于数据流的,占用极少的内存,是只读方式的,所以速度极快.只能采用遍历的模式查找数据节点 ...

  5. C#来创建和读取XML文档

    扩展标记语言XML(eXtensible Markup Language),是由W3C组织制定的.做为用于替代HTML语言的一种新型的标记语言, XML内部有着很多基本标准,XML就是通过与这些相关标 ...

  6. VBS操作XML文档,拷贝结点 (转)

    VBS操作XML文档,拷贝结点 (转) Dim xmlDoc,xmlRoot,xmlNode,lastNode,newNode Dim doc,docRoot,i,flag Dim strNodeNa ...

  7. 使用Libxml2操作XML文档

    一.Libxml2介绍: Libxml2 是一个xml的c语言版的解析器,本来是为Gnome项目开发的工具,是一个基于MIT License的免费开源软件.它除了支持c语言版以外,还支持c++.PHP ...

  8. xmlDocument来操作xml文档

    它的作用是解析xml文档,将其转换为对象,使你可以在程序中对其操作 例如如下的xml文档: <?xml version="1.0" encoding="utf-8& ...

  9. 第十三章、C#操作XML文档(XmlDocument、XmlNode、XmlAttribute、SelectSingleNode、SelectNodes、XmlNodeList)...

    XML文档是一种通用的文档,这种文档既可以用.config作为后缀也可以用.xml作为后缀.XML文档主要由元素节点和节点的属性共同构成的.它有且仅有一个根节点,其他的节点全部都是根节点的子节点或者子 ...

最新文章

  1. 如何查看SharePoint未知错误
  2. 关于凸优化的一些简单概念
  3. php调用mysql查询结果_php - 在php脚本中处理select查询结果集
  4. 华为向全球发布AI数据库、分布式存储,跑分轻松拿世界第一
  5. php判断手机浏览器,php 获取 手机浏览器的信息 | 学步园
  6. 十、Linux网络管理续集
  7. 再说人行分数解读分的作用
  8. 【转】学习理论,注重细节
  9. Matlab里c2d命令,matlab中c2d如何将连续函数离散化
  10. CentOS之——CentOS 6.5 安装RTL8111/8168B PCI EXPRESS网卡并解决安装出现的问题
  11. win10系统禁用笔记本自带键盘的方法
  12. 2020 阿里、字节iOS面试题之Runtime相关问题2
  13. 电脑突然重启解决方案
  14. 超级账本基金会执行董事Daniela Barbosa:开源区块链已成主流
  15. 苹果手机怎么用计算机打出字,使用苹果手机的注意啦!iphone输入法不好用?这些使用技巧教给你...
  16. java 集合之Interface Map<K,V> HashMap实现类
  17. SpringBoot——关于banner
  18. 作文提升~老师整理的优美排比句太实用
  19. MT9V034摄像头学习笔记(二)
  20. 把http升级到https——生命不息,折腾不止

热门文章

  1. springmvc 中controller与jsp传值
  2. java13 InputStream,Reader
  3. python接口自动化测试面试题_Python 接口自动化测试实战
  4. c#对象集合去重_C# List 对象去重
  5. 多个ip对应的是同一个mac_Python3+Scapy安装使用 + 查询本机对应网卡,IP,MAC代码...
  6. 河南城建学院linux期末试题,河南城建学院Linux期末考试复习题
  7. 2013百度校园招聘-机器学习和数据挖掘工程师-笔试题
  8. 关于Xbox live及其在中国的使用
  9. Shell基础知识(三)
  10. Android初级教程Activity小案例(计算器乘法运算)