Qt之QDomDocument操作xml文件-模拟ini文件存储
2018-07-13 15:44
399 查看
一、背景
不得不说Qt是一个很强大的类库,不管是做项目还是做产品,Qt自身封装的东西就已经非常全面了,我们今天的这篇文章就是模拟了Qt读写ini文件的一个操作,当然是由于一些外力原因,我们决定自己来完善下这个功能。好的,那么现在就让我们隆重的请出今天的主角--QSettings。这个类能干嘛呢? 答案就是:读写注册表或者读写ini文件,这对于我们做应用程序时记录一些可持久化数据非常有用。
二、QSettings访问ini文件
QSettings访问ini文件相对来说比较简单,我们只需要构造一个QSettings对象,传入文件名称和文件存储格式即可,如图1所示。但同时QSettings也有一些局限,如下:
1、QSettings的编码问题(QTBUG15543、QTBUG19552)
2、QSettings的key不能为中文
3、当在一个嵌套作用域多次构造QSettings时并设置了编码,此时访问文件设置的编码会失效
由于QSettings有一些限制,也就引出了我们这篇文章的内容,使用xml模拟ini文件,下面我们主要分析下怎么使用xml文件模拟ini文件,需要的接口并不多,读、写、新增和删除。
void xmlOperate::writeXml(const QString & filePath) { QDomDocument domDocument; QString strHeader( "version=\"1.0\" encoding=\"UTF-8\"" ); domDocument.appendChild( domDocument.createProcessingInstruction("xml", strHeader) ); QDomElement root = domDocument.createElement("groups"); domDocument.appendChild(root); for(auto iter = m_mItemMap.begin(); iter != m_mItemMap.end(); ++iter) { QDomElement groupNode = domDocument.createElement("group"); groupNode.setAttribute("name", iter.key()); QMap<QString, QString> items = iter.value(); for (auto iter2 = items.begin(); iter2 != items.end(); ++iter2) { QString key = iter2.key(); QString value = iter2.value(); QDomElement itemNode = domDocument.createElement("item"); itemNode.setAttribute("name", key); QDomText textNode = domDocument.createTextNode(value); itemNode.appendChild(textNode); groupNode.appendChild(itemNode); } root.appendChild(groupNode); } QFile file(filePath); if(file.open(QFile::WriteOnly | QFile::Text)) { QTextStream out(&file); domDocument.save(out, 4); file.close(); } qDebug() << m_mItemMap; }View Code [p]3、插入项
bool xmlOperate::addItem( const QString & value, const QString & group, const QString & key ) { if (value.isEmpty() || group.isEmpty()) { return false; } if (key.isEmpty()) { int count = m_mItemMap[group].size(); m_mItemMap[group][QString::number(count)] = value; } else { m_mItemMap[group][key] = value; } writeXml(m_filePath); return true; }
4、删除项
bool xmlOperate::removeItem( const QString & value, const QString & group, const QString & key /*= ""*/ ) { if (value.isEmpty() || group.isEmpty()) { return false; } if (key.isEmpty()) { int count = m_mItemMap[group].size(); if (count == 0) { return false; } auto iter = m_mItemMap[group].begin(); while (iter != m_mItemMap[group].end()) { if (iter.value() == value) { iter = m_mItemMap[group].erase(iter); } else { ++iter; } } } else { m_mItemMap[group].remove(key); } writeXml(m_filePath); return true; }
四、示例程序下载
如图3是测试代码生成的测试结果,group相当于ini文件中的一个分组,item表示分组中的一项
[/p]图3 测试程序结果
相关文章推荐
- WinForm中使用XML文件存储用户配置及操作本地Config配置文件
- 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
- WinForm中使用XML文件存储用户配置及操作本地Config配置文件(zt)
- 模拟ATM机(缺少文件操作部分,不能实现真正意义上的存储)
- Win32汇编教程十三 INI 文件的操作
- java----使用socket模拟简单的http请求服务器,响应简单的文件请求操作
- 解答:一个perl操作config.ini的出现的 cannot find file or dirctionary,可明明文件存在
- Delphi TIniFile 类 操作ini配置文件
- wince 读写 ini 文件 操作 MFC
- Windows Phone 7 隔离存储空间及文件操作
- .net 操作INI文件
- my.ini 文件 解决mysql无法存储中文字符问题
- android中的文件存储操作总结
- oracle模拟控制文件的损坏进行操作
- php操作ini配置文件
- MongoDB入门(8)- c#通过操作MongoDB GridFS实现文件的数据库存储
- C# 操作INI配置文件
- VC 操作 .ini 文件
- C# Ini文件操作实例
- Delphi 中对 ini 文件操作