Qt读写xml⽂件(QDomDocument)
⼀、简述
XML是⼀种标记语⾔,被设计⽤来结构化存储以及传输信息,是⼀种常⽤的⽂档数据结构。
就我个⼈⽽⾔,Qt下读写XML格式⽂件可以有三种⽅法:
⼀是使⽤纯C++的rapidxml开源库。优点是速度快,媲美strlen()的速度;缺点是处理中⽂⽐较⿇烦,编码只有ANSI格式。
⼆是使⽤QXmlStreamReader类,适当结合QXmlQuery类。优点是灵活性强,节约内存;缺点是理解起来相对较难,还需要⼀点数据库语⾔的知识。
三是使⽤QDomDocument类。是Qt下读写xml⽂件传统⽽普遍的做法,缺点就是如果读写的⽂件很⼤,会消耗⼤量的内存空间(必须包含Qt XML模块)。
QDomDocument类可以理解为⼀个QFile,这个类的对象代表了整个⽂件,通常也是⼀个xml⽂件的主节点。还需使⽤到的类有QDomNode(节点基类)、QDomElement(节点类)、QDomText(内容)、QDomAttr(属性)、
QDomProcessingInstruction(⽂件头)。
三、读写样式
<?xml version='1.0' encoding='utf-8'?>
<⽇销售清单>
<⽇期 date="2020-05-29">
<;时间 time="21:27:41">
<⼚家>⼆汽神龙</⼚家>
<;品牌>毕加索</品牌>
<;报价>39</报价>
<;数量>1</数量>
<⾦额>50</⾦额>
</时间>
<;时间 time="21:27:51">
<⼚家>⼆汽神龙</⼚家>
<;品牌>毕加索</品牌>
<;报价>39</报价>
<;数量>1</数量>
<⾦额>50</⾦额>
</时间>
<;时间 time="21:27:57">
<⼚家>⼆汽神龙</⼚家>
<;品牌>毕加索</品牌>
<;报价>39</报价>
<;数量>1</数量>
<⾦额>50</⾦额>
</时间>
</⽇期>
</⽇销售清单>
头⽂件
#ifndef DOCXML_H
#define DOCXML_H
#include <QString>
#include <QStringList>
#include <QDomDocument>
#include <QDomElement>
class DocXml
{
public:
DocXml();
static void CreateXml(const QString &filePath);//创建xml 空⽂件
static void AppendXml(const QString &filePath,QStringList list);
static void WriteXml(QDomDocument &doc,QDomElement &root,QStringList &list);
static void ReadXml(const QString &filePath,QStringList &fList,
QStringList &bList, QStringList &pList,
QStringList &nList, QStringList &tList);
};
#endif // DOCXML_H
创建空的XML⽂件
#include "docxml.h"
#include <QFile>
#include <QDomDocument>//⽂件
#include <QDomProcessingInstruction>//格式头部
#include <QDomElement>//元素
#include <QTextStream>
#include <QDebug>
#include <QDateTime>
#define cout qDebug()<<"["<< __FILE__ <<":"<< __LINE__ <<"]"
DocXml::DocXml()
{
}
void DocXml::CreateXml(const QString &filePath)
{
QFile file(filePath);
if(true== ists())//如果⽂件存在就不创建
{
cout <<"⽂件已存在";
return;
}
else{
if(file.open(QIODevice::WriteOnly))
{
//创建Xml⽂档
QDomDocument doc;
//创建XML头部格式
QDomProcessingInstruction ins = ateProcessingInstruction("xml","version = \'1.0\' encoding = \'utf-8\'");
//追加元素
doc.appendChild(ins);
//根节点元素
QDomElement root = ateElement("⽇销售清单");
doc.appendChild(root);
//保存
QTextStream stream(&file);//⽂本流关联⽂件
doc.save(stream,4);//4 代表缩进4个字符
file.close();//关闭⽂件
}
else
{
cout <<"打开⽂件失败";
}
}
}
追加 XML ⽂件
void DocXml::AppendXml(const QString &filePath, QStringList list)
{
QFile file(filePath);
if(file.open(QIODevice::ReadOnly))
{
//file和xml⽂档对象关联
QDomDocument doc;
if(doc.setContent(&file))//关联成功
{
file.close();//关闭⽂件
//获取根节点元素
QDomElement root = doc.documentElement();
//获取当前时间
QDateTime date = QDateTime::currentDateTime();
QString strDate = String("yyyy-MM-dd");
//判断根节点下⾯有没有⼦节点
if(root.hasChildNodes())
{
/
/查最后⼀个⼦节点
QDomElement lastEmt = root.lastChildElement();
if(lastEmt.attribute("date")== strDate)
{
//写有效数据
WriteXml(doc,lastEmt,list);
}
else
{
//创建⼦节点元素
QDomElement dateEmt = ateElement("⽇期");
/
/dateEmt.setAttribute("date",strDate); //建议写法
//创建date属性
QDomAttr dateAttr = ateAttribute("date");
//设置属性的值
dateAttr.setNodeValue(strDate);
//节点和属性关联
dateEmt.setAttributeNode(dateAttr);
//把⽇期节点追加到根节点
root.appendChild(dateEmt);
//写有效数据
WriteXml(doc,dateEmt,list);
}
}
else
{
//创建⼦节点元素
QDomElement dateEmt = ateElement("⽇期");
------------------------------------------------
dateEmt.setAttribute("date",strDate);//建议写法
------------------------------------------------
//创建date属性
//QDomAttr dateAttr = ateAttribute("date");
/
/设置属性的值
//dateAttr.setNodeValue(strDate);
//节点和属性关联
//dateEmt.setAttributeNode(dateAttr);
//把⽇期节点追加到根节点
root.appendChild(dateEmt);
//写有效数据
WriteXml(doc,dateEmt,list);
}
//保存⽂件
if(file.open(QIODevice::WriteOnly))
{
QTextStream stream(&file);
doc.save(stream,4);
file.close();
}
}
else
{
cout <<"关联失败";
}
}
else{
cout <<"打开⽂件失败";
}
}
向XML⽂件中写⼊
void DocXml::WriteXml(QDomDocument &doc, QDomElement &root, QStringList &list) {
//当前时间获取
QDateTime time = QDateTime::currentDateTime();
QString strTime = String("hh:mm:ss");
//创建节点元素
QDomElement timeEmt = ateElement("时间");
timeEmt.setAttribute("time",strTime);//设置属性值
//把时间节点追加到⽇期节点后⾯
root.appendChild(timeEmt);
QDomElement factory = ateElement("⼚家");
QDomElement brand = ateElement("品牌");
QDomElement price = ateElement("报价");
QDomElement num = ateElement("数量");
QDomElement total = ateElement("⾦额");
QDomText text = ateTextNode(list.at(0));
factory.appendChild(text);
text = ateTextNode(list.at(1));
brand.appendChild(text);
text = ateTextNode(list.at(2));
price.appendChild(text);
text = ateTextNode(list.at(3));
num.appendChild(text);
text = ateTextNode(list.at(4));
total.appendChild(text);
timeEmt.appendChild(factory);
timeEmt.appendChild(brand);
timeEmt.appendChild(price);
timeEmt.appendChild(num);
timeEmt.appendChild(total);
}
从XML⽂件中读取
void DocXml::ReadXml(const QString &filePath,QStringList &fList,
QStringList &bList, QStringList &pList,
xml文件怎么打开QStringList &nList, QStringList &tList)
{
QFile file(filePath);
if(file.open(QIODevice::ReadOnly))
{
//file和xml⽂档对象关联
QDomDocument doc;
if(doc.setContent(&file))
{
file.close();
QDateTime date = QDateTime::currentDateTime();
QString strDate = String("yyyy-MM-dd");
//获取根节点
QDomElement root = doc.documentElement();
发布评论