domXml.h
#ifndef DOMXML_H
#define DOMXML_H
#include <QFile>
#include <QDomComment>
#include <QDomElement>//元数
#include <QString>
#include <QDomProcessingInstruction>//格式头
#include <QStringList>
class DomXml
{
public:
DomXml();
static void createXml(QString filePath);
static void appendXml(QString filePath,QStringList list);
static void readXml(QString filePath,
QStringList &fList,
QStringList &bList,
QStringList &pList,
QStringList &nList,
QStringList &tList,
QStringList &testList);
static void writeXml(QDomDocument &doc,QDomElement &root,QStringList &list);
};
#endif // DOMXML_H
domXml.cpp
#include "domxml.h"
#include <QDebug>
#include <QTextStream>
#include <QIODevice>
#include <QDateTime>
#define cout qDebug()<<"["<<__FILE__<<":"<<__LINE__<<"]"
DomXml::DomXml()
{
}
void DomXml::createXml(QString filePath)
{
QFile file(filePath);
if(true == file.exists()){
//如果文件不存在就不创建
cout<<"file is exist";
return;
}else{
//如果文件存在就是直接创建
bool isOk = file.open(QIODevice::WriteOnly);
if(isOk == true){
//创建文档对象
QDomDocument doc;
//创建xml头部格式
QDomProcessingInstruction ins;
ins = doc.createProcessingInstruction("xml"," version=\"1.0\" encoding=\"UTF-8\"");
//追加元数
doc.appendChild(ins);
//根节点元数
QDomElement root = doc.createElement("日销售清单");
doc.appendChild(root);
//保存
QTextStream out(&file);
doc.save(out,4);
file.close();
}else{
cout<<"Write error";
return;
}
}
}
void DomXml::appendXml(QString filePath, QStringList list)
{
QFile file(filePath);
bool isOk = file.open(QIODevice::ReadOnly);
if(true == isOk){
//关联dom
QDomDocument doc;
isOk = doc.setContent(&file);
if(isOk == true){
file.close();
//获取根节点的元数
QDomElement root = doc.documentElement();
//获取当前时间
QDateTime date = QDateTime::currentDateTime();
QString dateStr = date.toString("yyyy-MM-dd");
//判断根节点有无子节点
if(root.hasChildNodes()){
//查找最后一个子节点
QDomElement lastElem = root.lastChildElement();
if(lastElem.attribute("date") == dateStr){//有有当天日期
writeXml(doc,lastElem,list);
}else{
//没有当天日期
//创建
QDomElement dateEmt = doc.createElement("日期");
//创建date属性
QDomAttr dateAtrr = doc.createAttribute("date");
//设置属性的值
dateAtrr.setNodeValue(dateStr);
//节点与属性关联
dateEmt.setAttributeNode(dateAtrr);
//把日期节点追加的根节点上
root.appendChild(dateEmt);
//写有效数据
writeXml(doc,dateEmt,list);
}
}
else{//没有子节点
//创建
QDomElement dateEmt = doc.createElement("日期");
//创建date属性
QDomAttr dateAtrr = doc.createAttribute("date");
//设置属性的值
dateAtrr.setNodeValue(dateStr);
//节点与属性关联
dateEmt.setAttributeNode(dateAtrr);
//把日期节点追加的根节点上
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";
return;
}
}
void DomXml::writeXml(QDomDocument &doc, QDomElement &root, QStringList &list)
{
//获取当前时间
QDateTime date = QDateTime::currentDateTime();
QString dateStr = date.toString("hh:mm:ss");
//创建时间节点元数
QDomElement timeEmt = doc.createElement("时间");
//创建属性
QDomAttr timeAtrr = doc.createAttribute("time");
//给属性设置值
timeAtrr.setNodeValue(dateStr);
//关联
timeEmt.setAttributeNode(timeAtrr);
root.appendChild(timeEmt);
//一堆里面的元数
QDomElement factory = doc.createElement("厂家");
QDomElement brand = doc.createElement("品牌");
QDomElement price = doc.createElement("报价");
QDomElement num = doc.createElement("数量");
QDomElement total = doc.createElement("金额");
QDomElement test = doc.createElement("test");
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);
text = doc.createTextNode(list.at(5));
test.appendChild(text);
timeEmt.appendChild(factory);
timeEmt.appendChild(brand);
timeEmt.appendChild(price);
timeEmt.appendChild(num);
timeEmt.appendChild(total);
timeEmt.appendChild(test);
}
void DomXml::readXml(QString filePath, QStringList &fList, QStringList &bList, QStringList &pList, QStringList &nList, QStringList &tList,QStringList &testList)
{
QFile file(filePath);
bool isOk = file.open(QIODevice::ReadOnly);
if(true == isOk) //打开成功
{
//file和xml文档对象关联
QDomDocument doc;
isOk = doc.setContent(&file);
if(isOk) //如果关联成功
{
//获取根节点
QDomElement root = doc.documentElement();
file.close();
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);
QString test = subList.at(5).toElement().text();
testList.append(test);
}
}
else
{
cout << "has not this cur day";
return;
}
}
else
{
cout << "not child";
return;
}
}
else
{
cout << "setContent error";
return;
}
}
else
{
cout << "ReadOnly error";
return;
}
}
mainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "domxml.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
DomXml::createXml("./test2.xml");
QStringList list;
list << "二汽神龙" << "毕加索" << "39" << "1" << "39"<<"20";
DomXml::appendXml("./test2.xml", list);
QStringList fList;
QStringList bList;
QStringList pList;
QStringList nList;
QStringList tList;
QStringList testList;
DomXml::readXml("./test2.xml", fList, bList, pList, nList, tList, testList);
for(int i = 0; i < fList.size(); i++)
{
QString str = QString("%1:%2:卖出了%3,单价:%4, 总价: %5,test: %6")
.arg(fList.at(i))
.arg(bList.at(i))
.arg(nList.at(i))
.arg(pList.at(i))
.arg(tList.at(i))
.arg(testList.at(i));
qDebug() << str.toUtf8().data();
}
}
run: