[QT操作XML]QT读写XML文件,QT修改XML文件
[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文件相关推荐
- JavaEE XML的读写(利用JDom对XML文件进行读写)
1.有关XML的写 利用JDom2包,JDom2这个包中,至少引入org.jdom2.*;如果要进行XML文件的写出,则要进行导入org.jdom2.output.*; package com.lit ...
- php如何修改xml中的数据,php如何修改xml内容
php修改xml内容的方法:首先打开xml文件:然后遍历一下该xml文档:接着通过"foreach ($books as $book) {...}"方式对内容进行重新赋值:最后保存 ...
- python解析xml读取指定属性_python批量修改xml某些内容和属性
在训练时,有时候需要将jpg格式转换为png格式,顺便也要把jpg标注的xml文件转换为png的xml文件.例如,需要把xml文件中的图像后缀名".jpg"批量去掉,这时候就需要批 ...
- mysql的socket文件_修改socket文件, MySQL启动报错
事情是这样的, 我要搭建MySQL主从, 做读写分离, 然后就要了一台服务器搭建mysql, 最近犯懒, 就寻思搞一个二进制的吧直接启用 一堆问题就出现了 [ERROR] Can't start se ...
- python修改json文件_python修改json文件的value实例方法
利用python修改json文件的value方法 做工程时遇到需要监听json文件,根据json文件中的key-value值作出相应处理的情形.为此写了修改json文件的python脚本供工程后续调用 ...
- Keil MDK5工程文件不可修改(文件符号上带一个黄色的钥匙)
在使用MDK5编写程序的时候,有一次突然出现了工程内所有的文件都不可以修改的情况,如图所示: 文件上有一个黄色的钥匙标识,所有文件全都不可以修改,包括增删文件等等. 经排查出现这种情况的原因是将该工程 ...
- r星服务器在那个文件,gta5修改host文件连接r星服务器方法介绍
<GTA5>中很多反映遇到登陆R星服务器很慢或者连接不上的问题,如何解决?下面带来玩家"俠盗猎车手5"分享的优化连接R星服务器方法,一起来看看吧. [用处]host文件 ...
- 添加数据文件及修改数据文件的位置
恢复后为临时表空间添加数据文件 SQL> alter tablespace temp add file 'D:\oracle\product\10.1.0\oradata\myoracle\t ...
- msi文件替换修改cab文件
一些产品打包发布时希望把cab文件注入msi文件或者替换msi里的cab文件,我前段时间做了相关的工作,与大家分享下. 软件准备:Orca,msidb,cabarc. 首先运行Orca,打开目标msi ...
- 用python查找指定格式或名称的文件及修改指定文件夹名称
写这个也是为了能更好的学习python,大家有什么意见可以提出来,这个代码直接放到编译器中运行即可. #-*- coding: GBK -*- import os, sys, re newdir = ...
最新文章
- FJ省队集训DAY3 T1
- Kafka Log Compaction 解析
- linux rsync 原理,rsync 同步原理和类别
- STL之bitset
- ASP.NET (C#) 面试笔试题目收集
- php 转发邮件,PHP Email();我不接收转发的电子邮件
- Fast上传图片成功,FastDFSweb页面显示失败
- [Bzoj1911][Apio2010]特别行动队(斜率优化)
- matlab超限像素平滑法_教程 | 不做手残党,玩转像素风LOGO的三大实用技巧!
- JS函数式编程——来源freecodecamp
- UE4镜头抖动CameraShake
- Linux Mint 11开启Compiz Fusion特效
- 专访李亚锋:“大数据+”趋势下的电信实践之路
- 2023江苏大学计算机考研信息汇总
- 2021年广东省安全员B证第三批(项目负责人)新版试题及广东省安全员B证第三批(项目负责人)作业模拟考试
- 速腾聚创RS-LiDAR激光雷达点云格式转换
- SSL weak ciphers 漏洞修复过程
- 全球及中国LCP行业发展动态与投资趋势分析报告2022~2028年
- 【UE】地球光照模拟--太空视角
- 大师的话一语道破.强烈建议阅读