Qt学习第6天:xml 【笔记】
文章目录1. UI界面2. xml3. 实用技巧1. UI界面2. xml3. 实用技巧
·
xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 有头有尾:开始标签,闭合标签 -->
<!-- 配置文件常用xml -->
<info>
<stu id="1">
<name>mike</name>
<sex>female</sex>
<score>18</score>
</stu>
<stu id="2">
<name>jack</name>
<sex>male</sex>
<score>20</score>
</stu>
</info>
实现如下效果:
<?xml version='1.0' encoding='utf-8'?>
<日销售清单>
<日期 date="2020-05-19">
<时间 time="10-30-58">
<厂家>二汽神龙</厂家>
<品牌>毕加索</品牌>
<报价>39</报价>
<数量>1</数量>
<金额>39</金额>
</时间>
</日期>
</日销售清单>
直接上代码:
domxml.h
#ifndef DOMXML_H
#define DOMXML_H
#include <QString>
#include <QStringList>
#include <QDomDocument>
#include <QDomElement>
class DomXml
{
public:
DomXml();
static void createXML(QString filePath);//创建xml文件
//list.at(0) = 二汽神龙
static void appendXML(QString filePath,QStringList list);
static void writeXML(QDomDocument &doc,QDomElement &root,QStringList list);
static void readXML(QString filePath,
QStringList &fList,
QStringList &bList,
QStringList &pList,
QStringList &nList,
QStringList &tList);
};
#endif // DOMXML_H
domxml.cpp
#include "domxml.h"
#include <QFile>
#include <QDomDocument>//文件
#include <QDomProcessingInstruction>//格式头部
#include <QDomElement> //元素
#include <QTextStream> //文本流
#include <QDateTime>
#include <QDebug>
#define cout qDebug() << "[" <<__FILE__ << ":" <<__LINE__ <<"]"
DomXml::DomXml()
{
}
//创建xml空文件
void DomXml::createXML(QString filePath)
{
QFile file(filePath);//关联文件名字
if(true == file.exists())//如果存在就不创建
{
cout << "文件已经存在";
return;
}
else
{
//不存在才创建
//只写方式打开文件
bool isOk = file.open(QIODevice::WriteOnly);
if(true == isOk)//如果打开成功
{
//创建xml文档对象
QDomDocument doc;
//创建xml头部格式
QDomProcessingInstruction ins;
//注意,要有反斜杠转义
//<?xml version="1.0" encoding="UTF-8"?>
ins = doc.createProcessingInstruction("xml","version=\'1.0\' encoding=\'utf-8'");
//追加元素
doc.appendChild(ins);
//根节点元素
QDomElement root = doc.createElement("日销售清单");
doc.appendChild(root);
//保存
QTextStream stream(&file);//文本流关联文件
doc.save(stream,4);//4为缩进字符个数
file.close();//关闭文件
}
else
{
cout << "WriteOnly error!";
return;
}
}
}
void DomXml::appendXML(QString filePath, QStringList list)
{
QFile file(filePath);
bool isOk = file.open(QIODevice::ReadOnly);
if(true == isOk)//打开成功
{
//file和xml文档对象关联
QDomDocument doc;
isOk = doc.setContent(&file);
if(isOk)//如果关联成功
{
file.close();//关闭文件
//获取根节点元素
QDomElement root = doc.documentElement();
//获取当前时间
QDateTime date = QDateTime::currentDateTime();
QString dateStr = date.toString("yyyy-MM-dd");
//判断根节点下有没有子节点
if(root.hasChildNodes())//如果有子节点
{
//查找最后一个子节点
QDomElement lastEmt = root.lastChildElement();
if(lastEmt.attribute("date") == dateStr)
{
//有无当天日期,如果有
//写有效数据
writeXML(doc,lastEmt,list);
}
else//如果没有,创建新的
{
//创建日期子节点元素
QDomElement dateEmt = doc.createElement("日期");
//创建date属性
QDomAttr dateAttr = doc.createAttribute("date");
//设置属性的值
dateAttr.setNodeValue(dateStr);
//节点和属性关联
dateEmt.setAttributeNode(dateAttr);
//把日期节点追加到根节点上
root.appendChild(dateEmt);
//写有效数据
writeXML(doc,dateEmt,list);
}
}
else //没有子节点
{
//创建日期子节点元素
QDomElement dateEmt = doc.createElement("日期");
//创建date属性
QDomAttr dateAttr = doc.createAttribute("date");
//设置属性的值
dateAttr.setNodeValue(dateStr);
//节点和属性关联
dateEmt.setAttributeNode(dateAttr);
//把日期节点追加到根节点上
root.appendChild(dateEmt);
//写有效数据
writeXML(doc,dateEmt,list);
}
//保存文件
isOk = file.open(QIODevice::WriteOnly);
if(isOk)
{
QTextStream stream(&file);
doc.save(stream,4);
file.close();
}
}
else {
cout << "setContent error!";
return;
}
}
else {
cout <<"ReadOnly error!";
}
}
void DomXml::writeXML(QDomDocument &doc, QDomElement &root, QStringList list)
{
//当前时间获取
QDateTime time = QDateTime::currentDateTime();
QString timeStr = time.toString("hh-mm-ss"); //16:05:22
//创建时间节点元素
QDomElement timeEmt = doc.createElement("时间");
//创建属性
QDomAttr timeAttr = doc.createAttribute("time");
//给属性设置值
timeAttr.setNodeValue(timeStr);
//时间节点元素和属性关联
timeEmt.setAttributeNode(timeAttr);
//把时间节点追加到日期节点下
root.appendChild(timeEmt);
QDomElement factory = doc.createElement("厂家");
QDomElement brand = doc.createElement("品牌");
QDomElement price = doc.createElement("报价");
QDomElement num = doc.createElement("数量");
QDomElement total = doc.createElement("金额");
//给属性节点添加内容
QDomText text = doc.createTextNode(list.at(0));
factory.appendChild(text);
text = doc.createTextNode(list.at(1));
brand.appendChild(text);
text = doc.createTextNode(list.at(2));
price.appendChild(text);
text = doc.createTextNode(list.at(3));
num.appendChild(text);
text = doc.createTextNode(list.at(4));
total.appendChild(text);
//把属性节点追加到其父节点
timeEmt.appendChild(factory);
timeEmt.appendChild(brand);
timeEmt.appendChild(price);
timeEmt.appendChild(num);
timeEmt.appendChild(total);
}
void DomXml::readXML(QString filePath, QStringList &fList, QStringList &bList, QStringList &pList, QStringList &nList, QStringList &tList)
{
QFile file(filePath);
bool isOk = file.open(QIODevice::ReadOnly);
if(true == isOk)//打开成功
{
//file和xml文档对象关联
QDomDocument doc;
isOk = doc.setContent(&file);
if(isOk)//如果关联成功
{
file.close();
//获取根节点
QDomElement root = doc.documentElement();
QDateTime date = QDateTime::currentDateTime();
QString dateStr = date.toString("yyyy-MM-dd");
if(root.hasChildNodes())//有没有子节点
{
//找最后一个节点
QDomElement lastEmt = root.lastChildElement();
if(lastEmt.attribute("date") == dateStr)//判断有无当前日期
{
//找出当前日期下所有时间子节点
QDomNodeList list = lastEmt.childNodes();
for (int i=0;i<list.size();i++)
{
//list.at(0).toElement();
//转换为元素,找到时间节点下的所有子节点
QDomNodeList subList = list.at(i).toElement().childNodes();
//厂家
QString factory = subList.at(0).toElement().text();
fList.append(factory);
QString brand = subList.at(1).toElement().text();
bList.append(brand);
QString price = subList.at(2).toElement().text();
pList.append(price);
QString num = subList.at(3).toElement().text();
nList.append(num);
QString total = subList.at(4).toElement().text();
tList.append(total);
}
}
else {
cout << "没有当前日期";
return;
}
}
}
else
{
cout << "setContentt error";
return;
}
}
else
{
cout <<"ReadOnly error";
return;
}
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "domxml.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
DomXml::createXML("../demo.xml");
QStringList list;
list << "二汽神龙" << "毕加索" << "39" << "1" << "39";
DomXml::appendXML("../demo.xml",list);
QStringList fList,bList,pList,nList,tList;
DomXml::readXML("../demo.xml",fList,bList,pList,nList,tList);
for (int i = 0;i < fList.size(); i++)
{
QString str = QString("%1:%2:卖出了%3,单价:%4,总价:%5")
.arg(fList.at(i))
.arg(bList.at(i))
.arg(pList.at(i))
.arg(nList.at(i))
.arg(tList.at(i));
qDebug() << str;
}
}
Widget::~Widget()
{
delete ui;
}
实用技巧
- 新加入的类或者模块,如果方法或类不显示高亮,
close All然后重新打开一下即可刷新
更多推荐

所有评论(0)