XML文件一般格式如下:
<--注释:除了第一行,随便写 有头有尾 有开始标签就有闭合标签 -->
xml优点是比较灵活
html5很多标签都是固定的
设定规则主要是用来存储数据,标签可以任意定义
保存数据库很轻松
文本文件1##mike##female##10 把数据存储在文本文件中不美观
xml存储数据很人性化
以前的操作系统对数据库支持不好,存储数据用xml
安卓手机根目录下,存储一些数据也用xml
网络上可以组xml传输数据
xml主要用于存储数据,做配置文件
html5主要用于显示数据
xml中,根节点有且仅有一个
xml中,子节点可以有任意个
Qt中平时做ui,每次对ui修改,都会自动修改对应的.ui(实际上上.xml文件)文件
mike //元素 node--》元素
female
10
mike
female
10
Qt源文件:
//xmltest.pro
QT += core gui sql xml
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
domxml.cpp \
main.cpp \
mainwindow.cpp
HEADERS += \
domxml.h \
mainwindow.h
FORMS += \
mainwindow.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
//domxml.h
#ifndef DOCXML_H
#define DOCXML_H
#include
#include
#include
#include
class DomXML
{
public:
DomXML();
static void createXML(QString filePath);//创建xml空文件
//静态不需要通过对象来调用
static void appendXML(QString filePath,QStringList list);
//list.at(0)=二汽神龙
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 // DOCXML_H
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
//domxml.cpp
#include "domxml.h"
#include
#include //xml文件指针
#include //格式头部
#include //元素
#include
#include //日期时间
#define cout qDebug()<<"["<<__FILE__<<":"<<__LINE__<<"]"
#include
//appendChild()追加
DomXML::DomXML()
{
}
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;
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代表缩进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)//打开成功
{
//操作xml一定要有一个文档指针。
//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");//2019-10-10
//判断根节点下有没有子节点
if(root.hasChildNodes()){//如果有子节点
//xml里存储了很多信息,如果再次存入的是当天的信息则采用在当天日期元素下追加一个时间节点
//否则新建一个日期节点元素
//查找最后一个子节点
QDomElement lastEmt=root.lastChildElement();
if(lastEmt.attribute("date")==dateStr){
//有当天日期
writeXML(doc,lastEmt,list);//在下边添加时间
}else{
//没有当天日期,copy下边代码 复用一下
//创建日期子节点元素
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);
}
}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");//14:03:03
//创建时间节点元素
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)//打开成功
{
//操作xml一定要有一个文档指针。
//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();
//list.at(0);
for(int i=0;i
//main.cpp
#include "mainwindow.h"
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "domxml.h"
#include
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
DomXML::createXML("../demo.xml");//创建一个空的xml文件
QStringList list;
list<<"二汽神龙"<<"毕加索"<<"39"<<"1"<<"39";
DomXML::appendXML("../demo.xml",list);
QStringList fList;
QStringList bList;
QStringList pList;
QStringList nList;
QStringList tList;
DomXML::readXML("../demo.xml",fList,bList,pList,nList,tList);
for(int i=0;i
<--mainwindow.ui-->
MainWindow
0
0
800
600
MainWindow
0
0
800
26