前言
读写普通的xml文件从百度上面搜可以搜到很多,而此篇博客与大部分上面所搜到的读写都不同。此篇博客增加了一个额外的需求将一个路径下面所有的文件以及文件夹
通过字符串的方式传递给下面的函数,然后实现将文件路径写入指定的文件中。
读取文件路径并写入xml文件
使用QXmlStreamWriter
闲言碎语
我这次所犯的错误未误以为QXmlStream能够实现多次读写,也就是不断的打开文件,并链接相应的info
。当你在百度的时候,你会得到两种读写xml文件的方式,而目测起来会以后地一种使用QXmlStream
的方式会更加方便与简洁,然后,一旦你的需求复杂起来,你就会发现,还是使用QDomDocument
好用的。所以,以下会稍微介绍以下两种方法,主要还是在第二种。第一种的读写方式可以参考使用Qt5的QXmlStreamWriter和QXmlStreamReader实现xml文件的写入和读取
知识点
1)快速解析:QXmlStreamReader 、 QXmlStreamWriter。这是一种快速的基于流的方式访问 XML 文档,它只需读取文档一次,然后像一个遍历器从头到尾一次性处理 XML 文档,期间不会有反复的情况,也就是不会读完第一个标签,然后读第二个,读完第二个又返回去读第一个。
QXmlStreamReader使用了递增式的解析器,适合于在整个XML文档中查找给定的标签、读入无法放入内存的大文件以及处理XML的自定义数据。每次QXmlStreamReader的readNext()函数调用,解析器都会读取下一个标记,按照返回的标记类型进行处理。
QXmlStreamWriter类提供了简单流接口的XML写入器,写入XML文档只需要调用相应的标记写入函数来写入相关数据。
只能实现这样的效果:
而实际上,Info1的内部是还有文件以及文件夹的,而此时用递归却遍历不到内部了。
2)DOM树读写:QDomDocument。将整个 XML 文档读入内存,构建成一个树结构,允许程序在树结构上向前向后移动导航,这是与另外两种方式最大的区别,也就是允许实现多次读写。DOM 方式带来的问题是需要一次性将整个 XML 文档读入内存,因此会占用很大内存;但是因为储存在内存里,所以实现频繁修改比较方便。
下面是我实现前言中所说功能的主要的一些函数。
code
:
#include "MainWindow.h"
CMainWindow::CMainWindow(QWidget *parent)
: QMainWindow(parent)
{
saveProject();
}
CMainWindow::~CMainWindow()
{
}
//本小类用于保存工程的初始化
void CMainWindow::saveProject()
{
QString fileName="E:/Test/test.xml";//这是要写入的目标文件。
QDomDocument doc;
QString path = "E:/Test";//这是要进行检测的目标文件夹
saveSelectedToFile(fileName);
}
//本小类用于将所得到的链接好的doc写入xml文件中
void CMainWindow::saveSelectedToFile(QString fileName)
{
QDomDocument doc;
QString path = "E:/Test";
saveSelectedToDoc(doc,path);
QFile file(fileName);
bool bSuccess = file.open(QIODevice::WriteOnly);
if(bSuccess == false)
{
file.close();
return;
}
QTextStream out(&file);
m_doc.save(out, 4);
file.close();
}
//本小类用于将xml文件的一些头部写入xml文件中
void CMainWindow::saveSelectedToDoc(QDomDocument