[QT操作XML]QT读写XML文件

  • XML简介
  • QT操作XML,写入、读取、修改
  • XML效果演示

XML简介

概念:Extensible Markup Language 可扩展标记语言(可扩展:标签都是自定义的)
功能:存储数据(1. 配置文件、2. 在网络中传输)
XML基本语法:
1. xml文档的后缀名 .xml
2. xml第一行必须定义为文档声明
3. xml文档中有且仅有一个根标签
4. 属性值必须使用引号(单双都可)引起来
5. 标签必须正确关闭
6. xml标签名称区分大小写
文档声明格式:<?xml version='1.0' encoding='UTF-8'?>
version:版本号,必须的属性
encoding:编码方式,告知解析引擎当前文档使用的字符集编码方式,默认值:ISO-8859-1
standalone:是否独立(取值,yes:不依赖其他文件;no:依赖其他文件)

QT操作XML,写入、读取、修改

pro文件增加xml模块:QT += xml
包含头文件:#include

//写入XML
void MainWindow::writeXML()
{QFile file("test.xml");//打开或新建xml文件if(!file.open(QIODevice::WriteOnly|QIODevice::Truncate))//Truncate表示清空原来的内容{QMessageBox::warning(this,"错误","文件打开失败");return;}QDomDocument doc;//写入xml头部QDomProcessingInstruction instruction;//添加处理指令instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");doc.appendChild(instruction);//添加根节点QDomElement root = doc.createElement("library");doc.appendChild(root);//添加第一个子节点,及其子元素QDomElement book = doc.createElement("book");book.setAttribute("id",1);//方法1,创建属性,键值对可以是各种类型QDomAttr time = doc.createAttribute("time");//方法2,创建属性,值必须是字符串time.setValue("2020/6/3");book.setAttributeNode(time);QDomElement title = doc.createElement("title");//创建子元素QDomText text = doc.createTextNode("C++ primer");//设置括号标签中间的值book.appendChild(title);title.appendChild(text);QDomElement author = doc.createElement("author");//创建子元素text = doc.createTextNode("Stanley B.Lippman");author.appendChild(text);book.appendChild(author);root.appendChild(book);//添加第二个子节点,部分变量只需重新赋值book=doc.createElement("book");book.setAttribute("id",2);time = doc.createAttribute("time");time.setValue("2007/5/25");book.setAttributeNode(time);title = doc.createElement("title");text = doc.createTextNode("Thinking in Java");book.appendChild(title);title.appendChild(text);author = doc.createElement("author");text = doc.createTextNode("Bruce Eckel");author.appendChild(text);book.appendChild(author);root.appendChild(book);//输出文件QTextStream out_stream(&file);doc.save(out_stream,4);//缩进4格file.close();
}//读XML文件
void MainWindow::readXML()
{QFile file("test.xml");if(!file.open(QIODevice::ReadOnly)){QMessageBox::warning(this,"错误","读XML,文件打开失败");return;}QDomDocument doc;if(!doc.setContent(&file))//从字节数组中解析XML文档,并将其设置为文档的内容{file.close();return;}file.close();QDomElement root = doc.documentElement();//返回根节点qDebug()<<"["<<__FILE__<<"]"<<__LINE__<<__FUNCTION__<<"root.nodeName "<<root.nodeName();//打印根节点QDomNode node = root.firstChild();//获得第一个子节点while(!node.isNull())//如果节点不为空{if(node.isElement())//如果节点是元素{QDomElement e= node.toElement();//节点转换为元素//打印键值对,tagName和nodeName相同qDebug() << e.tagName()<< " " <<e.attribute("id")<<" "<<e.attribute("time");QDomNodeList list = e.childNodes();//子节点列表for(int i=0;i<list.count();i++)//遍历子节点{QDomNode n = list.at(i);if(n.isElement())qDebug() << n.nodeName()<<":"<<n.toElement().text();}}node=node.nextSibling();//下一个兄弟节点}
}//增加XML内容
//先把文件读进来,再重写
void MainWindow::addXML()
{QFile file("test.xml");if(!file.open(QIODevice::ReadOnly)){QMessageBox::warning(this,"错误","增加XML,文件打开失败1");return;}QDomDocument doc;if(!doc.setContent(&file))//从字节数组中解析XML文档,并将其设置为文档的内容{file.close();return;}file.close();QDomElement root=doc.documentElement();QDomElement book=doc.createElement("book");book.setAttribute("id",3);book.setAttribute("time","1813/1/27");QDomElement title=doc.createElement("title");QDomText text;text=doc.createTextNode("Pride and Prejudice");title.appendChild(text);book.appendChild(title);QDomElement author=doc.createElement("author");text=doc.createTextNode("Jane Austen");author.appendChild(text);book.appendChild(author);root.appendChild(book);if(!file.open(QFile::WriteOnly|QFile::Truncate))//重写文件,如果不用truncate就是在后面追加内容,就无效了{QMessageBox::warning(this,"错误","增加XML,文件打开失败2");return;}QTextStream out_stream(&file);doc.save(out_stream,4);file.close();
}//删减XML内容
void MainWindow::removeXML()
{QFile file("test.xml");if(!file.open(QIODevice::ReadOnly)){QMessageBox::warning(this,"错误","增加XML,文件打开失败1");return;}QDomDocument doc;if(!doc.setContent(&file))//从字节数组中解析XML文档,并将其设置为文档的内容{file.close();return;}file.close();QDomElement root=doc.documentElement();QDomNodeList list = doc.elementsByTagName("book");//指定名称的节点列表for(int i=0;i<list.count();i++){QDomElement e = list.at(i).toElement();if(e.attribute("time")=="2007/5/25")root.removeChild(list.at(i));}if(!file.open(QFile::WriteOnly|QFile::Truncate))//重写文件,如果不用truncate就是在后面追加内容,就无效了{QMessageBox::warning(this,"错误","删减XML内容,文件打开失败");return;}QTextStream out_stream(&file);doc.save(out_stream,4);file.close();
}//更新XML内容
//如果了解XML结构,可以直接定位到指定标签上更新
//或者用遍历的方法去匹配tagname或者attribut,value来更新
void MainWindow::updateXML()
{QFile file("test.xml");if(!file.open(QIODevice::ReadOnly)){QMessageBox::warning(this,"错误","更新XML,文件打开失败1");return;}QDomDocument doc;if(!doc.setContent(&file))//从字节数组中解析XML文档,并将其设置为文档的内容{file.close();return;}file.close();QDomElement root = doc.documentElement();//获得根节点QDomNodeList list = root.elementsByTagName("book");//指定名称的节点列表QDomNode node = list.at(list.count()-1).firstChild();//定位到第三个一级子节点的子元素QDomNode oldNode = node.firstChild();//标签之间的内容作为节点的子节点出现,当前是Pride and ProjudiceoldNode.setNodeValue("dalao");//修改元素内容
//    node.firstChild().setNodeValue("diannao");
//    QDomNode newNode = node.firstChild();
//    node.replaceChild(newNode,oldNode);if(!file.open(QFile::WriteOnly|QFile::Truncate))//重写文件,如果不用truncate就是在后面追加内容,就无效了{QMessageBox::warning(this,"错误","更新XML内容,文件打开失败2");return;}QTextStream out_stream(&file);doc.save(out_stream,4);file.close();
}

XML效果演示

<?xml version='1.0' encoding='UTF-8'?>
<library><book id="1" time="2020/6/3"><title>C++ primer</title><author>Stanley B.Lippman</author></book><book id="2" time="2007/5/25"><title>Thinking in Java</title><author>Bruce Eckel</author></book><book id="3" time="1813/1/27"><title>diannao</title><author>Jane Austen</author></book>
</library>

[QT操作XML]QT读写XML文件,QT修改XML文件相关推荐

  1. JavaEE XML的读写(利用JDom对XML文件进行读写)

    1.有关XML的写 利用JDom2包,JDom2这个包中,至少引入org.jdom2.*;如果要进行XML文件的写出,则要进行导入org.jdom2.output.*; package com.lit ...

  2. php如何修改xml中的数据,php如何修改xml内容

    php修改xml内容的方法:首先打开xml文件:然后遍历一下该xml文档:接着通过"foreach ($books as $book) {...}"方式对内容进行重新赋值:最后保存 ...

  3. python解析xml读取指定属性_python批量修改xml某些内容和属性

    在训练时,有时候需要将jpg格式转换为png格式,顺便也要把jpg标注的xml文件转换为png的xml文件.例如,需要把xml文件中的图像后缀名".jpg"批量去掉,这时候就需要批 ...

  4. mysql的socket文件_修改socket文件, MySQL启动报错

    事情是这样的, 我要搭建MySQL主从, 做读写分离, 然后就要了一台服务器搭建mysql, 最近犯懒, 就寻思搞一个二进制的吧直接启用 一堆问题就出现了 [ERROR] Can't start se ...

  5. python修改json文件_python修改json文件的value实例方法

    利用python修改json文件的value方法 做工程时遇到需要监听json文件,根据json文件中的key-value值作出相应处理的情形.为此写了修改json文件的python脚本供工程后续调用 ...

  6. Keil MDK5工程文件不可修改(文件符号上带一个黄色的钥匙)

    在使用MDK5编写程序的时候,有一次突然出现了工程内所有的文件都不可以修改的情况,如图所示: 文件上有一个黄色的钥匙标识,所有文件全都不可以修改,包括增删文件等等. 经排查出现这种情况的原因是将该工程 ...

  7. r星服务器在那个文件,gta5修改host文件连接r星服务器方法介绍

    <GTA5>中很多反映遇到登陆R星服务器很慢或者连接不上的问题,如何解决?下面带来玩家"俠盗猎车手5"分享的优化连接R星服务器方法,一起来看看吧. [用处]host文件 ...

  8. 添加数据文件及修改数据文件的位置

    恢复后为临时表空间添加数据文件 SQL> alter tablespace temp add file 'D:\oracle\product\10.1.0\oradata\myoracle\t ...

  9. msi文件替换修改cab文件

    一些产品打包发布时希望把cab文件注入msi文件或者替换msi里的cab文件,我前段时间做了相关的工作,与大家分享下. 软件准备:Orca,msidb,cabarc. 首先运行Orca,打开目标msi ...

  10. 用python查找指定格式或名称的文件及修改指定文件夹名称

    写这个也是为了能更好的学习python,大家有什么意见可以提出来,这个代码直接放到编译器中运行即可. #-*- coding: GBK -*-  import os, sys, re newdir = ...

最新文章

  1. FJ省队集训DAY3 T1
  2. Kafka Log Compaction 解析
  3. linux rsync 原理,rsync 同步原理和类别
  4. STL之bitset
  5. ASP.NET (C#) 面试笔试题目收集
  6. php 转发邮件,PHP Email();我不接收转发的电子邮件
  7. Fast上传图片成功,FastDFSweb页面显示失败
  8. [Bzoj1911][Apio2010]特别行动队(斜率优化)
  9. matlab超限像素平滑法_教程 | 不做手残党,玩转像素风LOGO的三大实用技巧!
  10. JS函数式编程——来源freecodecamp
  11. UE4镜头抖动CameraShake
  12. Linux Mint 11开启Compiz Fusion特效
  13. 专访李亚锋:“大数据+”趋势下的电信实践之路
  14. 2023江苏大学计算机考研信息汇总
  15. 2021年广东省安全员B证第三批(项目负责人)新版试题及广东省安全员B证第三批(项目负责人)作业模拟考试
  16. 速腾聚创RS-LiDAR激光雷达点云格式转换
  17. SSL weak ciphers 漏洞修复过程
  18. 全球及中国LCP行业发展动态与投资趋势分析报告2022~2028年
  19. 【UE】地球光照模拟--太空视角
  20. 大师的话一语道破.强烈建议阅读

热门文章

  1. 查找缺失的DLL工具Dependency Walker
  2. 云测平台进行软件兼容性测试
  3. 评价类模型——模糊综合评价
  4. 最新有效的rtsp流媒体测试地址
  5. java awt 简单计算器,JAVA Swing 开发简易计算器(上)
  6. 二元函数可微与可导的关系_函数连续、可导与可微之间的关系
  7. Ubuntu Linux 锐捷 ruijie 认证成功 校园网 西电 老校区 新校区
  8. 利用traffic control模拟网络延迟和丢包
  9. 安卓Android手机系统内文件夹全解
  10. CycleGAN与pix2pix不得不玩的模型