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
然後重新打開一下即可刷新