前言
什么要用QXmlStreamWriter来读写xml,因为他读写高效,对应参数量过大的,使用他来操作是比较合适的,另外一个的话就是真的很简单。
一、效果延时
二、程序讲解
1.操作类
注释比较清晰,直接看代码
#include "XmlDeal.h"
#include <QFile>
#include <QMutex>
#include <QXmlStreamWriter>
#include <QDebug>
#include <QCoreApplication>
#include <QApplication>
XmlDeal::XmlDeal(QObject *parent)
: QObject(parent)
{
}
XmlDeal::~XmlDeal()
{
}
void XmlDeal::Append(sItem item)
{
m_itemList << item;
}
bool XmlDeal::Save(QString strFileName)
{
QString strPathName = QApplication::applicationDirPath() + QString("/%1").arg(strFileName);
// 文件操作并不支持并发操作,所以这里一定要加锁,
// 要不然你后续的程序就可能回出现参数丢失的情况
static QMutex mutex;
mutex.lock();
QFile file(strPathName);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
mutex.unlock();
return false;
}
QXmlStreamWriter writer(&file);
// 模式都是UTF-8的格式,通用的方式
writer.setAutoFormatting(true);
// 文档写入开始了
writer.writeStartDocument();
// 用if(1)来进行折叠,这样比较容易理清楚目前程序是在哪个节点了
if (1)
{
// 写入一个ROOT节点
// 这里要注意的是writeStartElement()和writeEndElement()是要配套使用的
writer.writeStartElement("Root"); // Root
int nSize = m_itemList.size();
if (1)
{
writer.writeStartElement("ItemList"); // ItemList
for (int i = 0; i < nSize; i++)
{
writer.writeStartElement("Item"); // Item
// 写入XML属性值
writer.writeAttribute("Index", QString("%1").arg(i + 1));
writer.writeAttribute("Name", m_itemList.at(i).strName);
writer.writeAttribute("PosX", m_itemList.at(i).strPosX);
writer.writeAttribute("PosY", m_itemList.at(i).strPosY);
writer.writeEndElement(); // ItemList
}
writer.writeEndElement(); // ItemList
}
writer.writeEndElement(); // Root
}
// 文档写入结束了
writer.writeEndDocument();
if (file.isOpen())
file.close();
mutex.unlock();
return true;
}
2.应用层调用
代码如下:
#include "MyXmlWriter.h"
#include "XmlDeal.h"
MyXmlWriter::MyXmlWriter(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
XmlDeal xmlDeal;
// 添加测试数据
for (size_t i = 0; i < 30; i++)
{
sItem item;
item.strName = QString("Name%1").arg(i);
item.strPosX = QString("%1").arg(i * 10);
item.strPosY = QString("%1").arg(i * 100);
xmlDeal.Append(item);
}
xmlDeal.Save("myXml.xml");
}