39XML文档类

Xml源代码
domxml.h
#ifndef DOMXML_H
#define DOMXML_H
#include <QString>
#include <QStringList>
#include <QDomDocument> //文件
#include <QDomProcessingInstruction> //头部
#include <QDomElement> //元素
#include <QDomText>
class DomXML
{
public:
DomXML();
//创建空的XML
static void CreateXML(QString strFilePath);
//搭建XML结构
static void AppendXML(QString strFilePath,QStringList list);
//写XML
static void WriteXML(QDomDocument &doc,QDomElement &root,QStringList list);
//写XML
static void ReadXML(QString strFilePath,
QStringList &fList,
QStringList &bList,
QStringList &pList,
QStringList &nList,
QStringList &tList
);
};
#endif // DOMXML_H
domxml.cpp
#include "domxml.h"
#include <QFile>
#include <QTextStream>
#include <QDateTime>
#include <QDebug>
#define cout qDebug()<<"["<<__FILE__<<":"<<__LINE__<<"]"
DomXML::DomXML()
{
}
//创建空的xml文件
void DomXML::CreateXML(QString strFilePath)
{
//打开文件
QFile file(strFilePath);
if(file.exists())
{
cout<<"FilePath exists";
return ;
}
else
{
bool bIsOk=file.open(QIODevice::WriteOnly);
if(bIsOk)
{//打开文件成功
//创建xml文档对象
QDomDocument doc;
//创建xml头部格式<?xml version="1.0" encoding="UTF-8"?>
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个字符
}
else
{//文件打开失败
cout<<"open file error";
return ;
}
}
file.close();
}
//搭建XML格式
void DomXML::AppendXML(QString strFilePath,QStringList list)
{
//打开文件
QFile file(strFilePath);
bool bIsOk=file.open(QIODevice::ReadOnly);
if(bIsOk)
{
//file和xml文档对象关联
QDomDocument doc;
bIsOk=doc.setContent(&file);
if(bIsOk)
{//关联成功
file.close();
//根节点元元素
QDomElement root=doc.documentElement();
//获取当地时间
QDateTime date=QDateTime::currentDateTime();
QString strDate=date.toString("yyyy-MM-dd");//2018-2-8
//qDebug()<<strDate;
//判断根节点下有没有子节点
if(root.hasChildNodes())
{
//查找最后一个子节点
QDomElement lastEmt=root.lastChildElement();
//日期相同,同一天不创建新节点
if(lastEmt.attribute("date")==strDate)
{//相同直接写入
WriteXML(doc,lastEmt,list);
}
else
{//不相同创建新节点
//创建日期子节点元素
QDomElement dateEmt=doc.createElement("日期");
//创建date属性
QDomAttr dateAttr=doc.createAttribute("date");
//设置属性的值
dateAttr.setNodeValue(strDate);
//节点和属性关联
dateEmt.setAttributeNode(dateAttr);
//把日期节点追加到根节点
root.appendChild(dateEmt);
WriteXML(doc,dateEmt,list);
}
}
else
{//没有子节点
//创建日期子节点元素
QDomElement dateEmt=doc.createElement("日期");
//创建date属性
QDomAttr dateAttr=doc.createAttribute("date");
//设置属性的值
dateAttr.setNodeValue(strDate);
//节点和属性关联
dateEmt.setAttributeNode(dateAttr);
//把日期节点追加到根节点
root.appendChild(dateEmt);
WriteXML(doc,dateEmt,list);
}
bIsOk=file.open(QIODevice::WriteOnly);
if(bIsOk)
{
//保存
QTextStream stream(&file);//文本流关联文件
doc.save(stream,4); //4代表缩进4个字符
}
file.close();
}
else
{
cout<<"setContent error";
return ;
}
}
else
{
cout<<"open file error";
return ;
}
}
//写XML
void DomXML::WriteXML(QDomDocument &doc,QDomElement &root,QStringList list)
{
//获取当地时间
QDateTime time=QDateTime::currentDateTime();
QString strTime=time.toString("hh-mm-ss");//20:20:20
//创建时间节点元素
QDomElement timeEmt=doc.createElement("时间");
//创建元素属性
QDomAttr timeAttr=doc.createAttribute("time");
//设置属性的值
timeAttr.setNodeValue(strTime);
//时间节点与属性相关联
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);
}
//读XML
void DomXML::ReadXML(QString strFilePath,QStringList &fList,QStringList &bList,QStringList &pList,QStringList &nList,QStringList &tList)
{
QFile file(strFilePath);
bool bIsOk=file.open(QIODevice::ReadOnly);
QDateTime date=QDateTime::currentDateTime();
QString strDate=date.toString("yyyy-MM-dd");
if(bIsOk)
{
QDomDocument doc;
bIsOk=doc.setContent(&file);
if(bIsOk)
{
QDomElement root=doc.documentElement();
//是否有子节点
if(root.hasChildNodes())
{
QDomElement lastEmt=root.lastChildElement();
if(lastEmt.attribute("date")==strDate)
{//找到当天日期下所有时间子节点
QDomNodeList list=lastEmt.childNodes();
for(int i=0;i<list.size();++i)
{
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
{
qDebug()<<"没有当天日期";
return ;
}
}
}
}
else
{
cout<<"open file error";
}
}
测试调用部分
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QStringList>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QStringList list;
list<<"二汽神龙"<<"毕加索"<<"39"<<"1"<<"20";
DomXML::CreateXML("../demo.xml");
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<fList.size();++i)
{
QString str=QString("%1:%2:卖出了%3,单价:%4总价:%5")
.arg(fList.at(i))
.arg(bList.at(i))
.arg(nList.at(i))
.arg(pList.at(i))
.arg(tList.at(i));
qDebug()<<str.toUtf8().data();
}
}
MainWindow::~MainWindow()
{
delete ui;
}


39XML文档类的更多相关文章
- C++MFC编程笔记day05 文档类-单文档和多文档应用程序
文档类 1 相关类 CDocument类-父类是CCmdTarget类,所以,文档类也能够处理菜单等 命令消息. 作用保存和管理数据. 注意事项:怎样解决断言错 ...
- as3 文档类引用
/**文档类引用**/ public static var main:CoverMain; public function CoverMain() { main=this; }
- VS2010 MFC中 在FormView派生类里获取文档类指针的方法
经过苦苦调试,今晚终于解决了一个大问题. 我想要实现的是:在一个FormView的派生类里获取到文档类的指针. 但是出现问题:试了很多办法,始终无法获取到. 终于,此问题在我不懈地调试加尝试下解决了. ...
- 如何通过AS3加载外部SWF文件,调用外部文件文档类的方法?
一个Flash中通过AS3代码的Loader对象加载另一个SWF文件,并访问其中的文档类中的方法. 简单示例: 主文件:Main.fla, Main.as 被调用的文件:called.swf, Cal ...
- MFC框架类、文档类、视图类相互访问的方法
1.获取应用程序指针 CMyApp* pApp=(CMyApp*)AfxGetApp(); 2.获取主框架指针 CWinApp 中的公有成员变量 m_pMainWnd 就是主框架的指针 CMainFr ...
- C#通过调用WinApi打印PDF文档类,服务器PDF打印、IIS PDF打印
其他网站下载来的类,可以用于Winform.Asp.Net,用于服务器端PDF或其他文件打印. 直接上代码: using System; using System.Collections.Generi ...
- Swagger-UI 基于REST的API测试/文档类插件
现在多数的项目开发中,网站和移动端都需要进行数据交互和对接,这少不了使用REST编写API接口这种场景.例如我目前的工作,移动端交由了另一团队开发,不同开发小组之间就需要以规范和文档作为标准和协作基础 ...
- ES系列四、ES6.3常用api之文档类api
1.Index API: 创建并建立索引 PUT twitter/tweet/ { "user" : "kimchy", "post_date&quo ...
- VC2010 MFC文档类菜单快捷键无法加载问题
问题1. 在菜单中项中输入&Run\tF5, 运行显示Run,而不是Run F5. 问题2.在Accelerator中绑定了快捷键,但运行程序不起作用. 以上2中问题在VC++2008和VC+ ...
随机推荐
- swift - UILabel的用法
1.label的声明 class FirstyViewController: UIViewController { var label = UILabel()//初始化 override func v ...
- 连接oracle服务器超慢--原因分析
连接oracle服务器超慢:有如下原因可能会影响. 网络不好:oracle服务器跟本地网络不好. oracle服务器内存不足:导致反应超慢 监听日志listener.log太大:导致响应超慢. 所以对 ...
- N76E003学习之路(二)
最近一直在想N76E003和STM8M003的对比情况,在网上找了不少资料,看了不少文档,具体总结如下: STM8S003F3P6:一共20个脚,最多支持16个GPIO,支持16个外部中断:2个16位 ...
- JavaScript DOM 对象
JavaScript DOM 对象 什么叫DOM,DOM是文档对象模型(Document Object Model,是基于浏览器编程(在本教程中,可以说就是DHTML编程)的一套API接口,W3C ...
- React基础---->ReactJS的使用(一)
ReactJS的初次使用,比较简单的例子. React的使用 一.下载ReactJS,地址:http://reactjs.cn/react/downloads.html,直接解压就行. 二.在html ...
- centos7关闭自动锁屏
centos 7默认几分钟不动就锁屏,实在很讨厌,所以在设置中将其去掉 1.不同的版本应该设置的地方稍有变化,我不敢保证我的这个方法你一定可以用,所以用之前希望你了解你的系统的版本. 2.左上角点击应 ...
- 小程序开通微信支付 --- 微信商户平台绑定微信小程序APPID
首先情况是这样的:现有公司有个公众号,已经开通了微信支付(已经有一个商户平台),现在需要开发 微信小程序(也有微信支付),如果在小程序里面重新申请 微信支付,就显得比较麻烦.腾讯官方已经提供了 一个商 ...
- MDK软件仿真常见问题
一直不知道MDK该怎么仿真调试程序,之前试了好几次都没有成功.因为有个程序一直不知道里面的变量对应着外部怎么的模式,今天想起可以用仿真调试的方法查看当外部设置某种模式的时候, 内部变量的变化,这样想来 ...
- maven学习(二)(转)
一.maven父工程与子模块的拆分与聚合原理 问题描述:将ssh工程拆分为多个模块开发 1.1.拆分原理 创建一个maven project(pom),然后在创建三个子模块(maven moudule ...
- fiddler win10-1703Failed to register Fiddler as the system proxy
正解 The solution for the Fiddler error of "Failed to register Fiddler as the system proxy" ...