#include "domxml.h"
#include <QFile>
#include <QDomDocument>//xml文件指针
#include <QDomProcessingInstruction> //格式头部
#include <QDomElement> //元素
#include <QDebug>
#include <QDateTime> //日期时间
#define cout qDebug()<<"["<<__FILE__<<":"<<__LINE__<<"]"
#include <QTextStream>
#include <QMessageBox>
//appendChild()追加
DomXML::DomXML()
{
}
//新建XML文件及命名
void DomXML::createXML(QString filePath){
QFile file(filePath);//关联文件名字
if(true==file.exists()){//如果存在不创建
//cout<<"File already exists";
QMessageBox::information(nullptr, "WARMING", "File Already Exist");
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("Dailysaleslist");
doc.appendChild(root);//平级
//保存
QTextStream stream(&file);//文本流关联文件
doc.save(stream,4);//4代表缩进4字符
file.close();//关闭文件
}
else{
//cout<<"WriteOnly error";
QMessageBox::information(nullptr, "WARMING", "WriteOnly Error");
return;
}
}
}
//通过List内容,扩展写入XML文件内容
void DomXML::appendXML(QString filePath, QStringList list){
QFile file(filePath);
bool isOk=file.open(QIODevice::ReadOnly);
//file.close();//关闭文件
if(isOk==true)//打开成功
{
//qDebug()<<"open success";
//操作xml一定要有一个文档指针。
//file和xml文档对象关联
QDomDocument doc;
isOk=doc.setContent(&file);
if(isOk){//如果关联成功
//qDebug()<<"setContent success";
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("DAY");
//创建date属性
QDomAttr dateAttr=doc.createAttribute("date");
//设定属性的值
dateAttr.setNodeValue(dateStr);
//节点和属性关联
dateEmt.setAttributeNode(dateAttr);
//最重要的一步,把日期节点追加到根节点上
root.appendChild(dateEmt);
//写有效数据 文档,元素,内容
writeXML(doc,dateEmt,list);
}
}
else{
//没有子节点
//创建日期子节点元素
QDomElement dateEmt=doc.createElement("DAY");
//创建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";
QMessageBox::information(nullptr, "WARMING", "setContent error");
return;
}
}
else{
cout<<"ReadOnly error ";
QMessageBox::information(nullptr, "WARMING", "File Opened Failure");
}
}
//具体对XML文件进行写操作
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("TIME");
//创建属性
QDomAttr timeAttr=doc.createAttribute("time");
//给属性设置值
timeAttr.setNodeValue(timeStr);
//时间节点元素和属性关联
timeEmt.setAttributeNode(timeAttr);
//把时间节点追加到日期节点后面
root.appendChild(timeEmt);
QDomElement dbtype=doc.createElement("DBTYPE");
QDomElement dbname=doc.createElement("DBNAME");
QDomElement ipadress=doc.createElement("IPADRESS");
QDomElement port=doc.createElement("PORT");
QDomElement username=doc.createElement("USERNAME");
QDomElement code=doc.createElement("CODE");
//创建文本内容
QDomText text=doc.createTextNode(list.at(0));
dbtype.appendChild(text);
text=doc.createTextNode(list.at(1));
dbname.appendChild(text);
text=doc.createTextNode(list.at(2));
ipadress.appendChild(text);
text=doc.createTextNode(list.at(3));
port.appendChild(text);
text=doc.createTextNode(list.at(4));
username.appendChild(text);
text=doc.createTextNode(list.at(5));
code.appendChild(text);
//时间节点追加
timeEmt.appendChild(dbtype);
timeEmt.appendChild(dbname);
timeEmt.appendChild(ipadress);
timeEmt.appendChild(port);
timeEmt.appendChild(username);
timeEmt.appendChild(code);
}
//具体对XML文件进行读操作
void DomXML::readXML(QString filePath, QStringList &List0, QStringList &List1, QStringList &List2, QStringList &List3, QStringList &List4, QStringList &List5){
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<list.size();i++){
// list.at(0).toElement();
//转化成元素,找到我们时间下的所有子节点
QDomNodeList suList1=list.at(i).toElement().childNodes();
//厂家
QString dbtype=suList1.at(0).toElement().text();
List0.append(dbtype);
QString dbname=suList1.at(1).toElement().text();
List1.append(dbname);
QString ipadress=suList1.at(2).toElement().text();
List2.append(ipadress);
QString port=suList1.at(3).toElement().text();
List3.append(port
untitled1.rar
需积分: 0 189 浏览量
更新于2021-11-23
收藏 13KB RAR 举报
QT5是一个跨平台的C++应用程序开发框架,广泛用于创建桌面和移动应用。在这个场景中,我们关注的是如何在QT5环境中处理XML文件,包括创建、读取和写入操作。XML(eXtensible Markup Language)是一种结构化数据存储格式,常用于数据交换和配置文件。
我们需要包含必要的QT库,特别是`QtXml`模块,通过在代码开头添加以下语句:
```cpp
#include <QDomDocument>
#include <QDomElement>
#include <QFile>
#include <QTextStream>
```
接下来,我们讲解创建XML文件的过程。创建一个XML文件通常涉及定义文档类型定义(DTD)或XML Schema,然后构建文档对象模型(DOM)。在QT5中,我们可以使用`QDomDocument`来实现这一目标。例如,创建一个简单的XML文件,可以这样做:
```cpp
QDomDocument doc("MyXML");
QDomElement root = doc.createElement("根节点名");
doc.appendChild(root);
QDomElement child1 = doc.createElement("子节点1");
child1.appendChild(doc.createTextNode("值1"));
root.appendChild(child1);
// 添加更多子节点...
QFile file("output.xml");
if (file.open(QIODevice::WriteOnly)) {
doc.save(file, 4); // 4是缩进空格数,可调整
file.close();
}
```
读取XML文件,我们可以使用`QDomDocument`的`parse()`方法或`QFile`和`QTextStream`组合。下面是一个例子:
```cpp
QFile inputFile("input.xml");
if (inputFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
QDomDocument doc;
if (!doc.setContent(&inputFile)) {
qDebug() << "解析错误:" << doc.errorString();
} else {
QDomElement root = doc.documentElement();
QDomNodeList nodeList = root.elementsByTagName("子节点名");
for (int i = 0; i < nodeList.size(); ++i) {
QDomNode node = nodeList.at(i);
QDomElement element = node.toElement();
QString value = element.text();
// 处理读取到的值...
}
}
inputFile.close();
}
```
对于XML文件的写入,可以使用`QDomElement`的方法如`appendChild()`,`insertBefore()`等来修改或添加新的元素和属性。例如:
```cpp
QDomElement child2 = doc.createElement("新子节点");
child2.appendChild(doc.createTextNode("新值"));
root.appendChild(child2);
```
保存修改后的XML文件,可以使用与创建时相同的方法,调用`doc.save()`。
在实际应用中,可能还需要处理XML中的命名空间、属性、注释、处理指令等更复杂的情况。QT5的`QtXml`模块提供了丰富的API来支持这些功能。理解并熟练掌握这些方法,将使你在处理XML文件时游刃有余。
在QT5中处理XML文件是一个常用且重要的任务,通过`QDomDocument`和其他相关类,我们可以方便地进行创建、读取和写入操作,满足各种数据存储和交换的需求。实践中,应根据具体项目需求灵活运用,确保代码的稳定性和效率。
zhupieba
- 粉丝: 0
- 资源: 2
最新资源
- 日立hgp电梯mcub03主板维修原理图 日立gvf电梯mcub01主板维修原理图 日立hgp电梯evecd03变频器维修原理图 日立gvf电梯evecd01变频器维修原理图 日立hge电梯els-4
- 基于Python3的Mysql数据库操作封装类解析及其应用
- S7-200Smart PLC,MCGS触摸屏,使用中的机组程序,采用通讯方式同步控制3台变频器调速,温度采集程序
- RS422-ARINC429通讯转模块 RS422支持全双工通讯接口,通讯速率可设置,ARINC429支持发送和接收,每通道发送接收速率可单独设置,可卖板卡,也可以根据具体要求设计硬件,支持FPGA
- 无人艇(机)仿真,带gui 具体内容看图片 文字资料已遗失,主参数通过initial来生成,具体模型全部在simulink里面,可自行推导,或者加价我去推导 gui界面打开方式:在主界面输入gu
- MATLAB代码:基于多时间尺度滚动优化的多能源微网双层调度模型红旗红旗红旗火火 关键词:多能源微网 多时间尺度 滚动优化 微网双层模型 调度 红旗红旗 主要内容:代码主要
- 重庆大学 Python 考试题目解析与计算机基础知识点复习资料
- 西门子300PLC 分时产量计数程序,在地址不冲突情况下,改个启动计数条件,就可以拿来在项目上直接使用,间接寻址,程序直观明了,触摸屏有系统时间更改功能
- LNOI绝缘体上铌酸锂薄膜电光调制特性
- Apollo7.0-行为预测模块思维导图及该模块注释代码 , Apollo 7.0为Apollo最新版本,此次重点针对感知和预测算法,进行了模块升级 引入Inter-TNT行为预测模式,通过障碍物与
- 数学建模竞赛之城市交通拥堵与优化-华数杯赛题解析及应用
- 西门子UG后处理三轴后处理840D828D系统 界面简洁,没那么多字幕 无使用限制 带刀具信息 带备刀 带ij圆弧输出 输出m08冷却液 程序段m1暂停 g41半径补偿 结尾回零点 带pui 840没
- simulink 风电调频,双馈风机调频,VSG同步机控制,风电场调频,三机九节点,带有惯性控制,下垂控制 同步机为火电机组,水轮机,可实现同步机调频,火电调频,水轮机调频等 风电渗透20%,ph
- Matlab路径规划算法代码 传统A star算法源码+详细注释 可固定地图和起点终点 适合初学者入门学习使用 保证运行
- 冲床送料机程序,送料机程序,伺服送料机程序,伺服电机,程序,三菱,台达,中达一体机,送料机程序,PLC多段数据不同,可任意调节A段B段c段长度,并定长切断 程序能存储5段工件数据,使用调出非常方便
- 项目:超声波-基于Arduino的超声波距离测量(LCD1602显示) 设计;proteus 仿真(版本8.9-可提供软件安装包) 主控:Arduino UNO 外设:超声波,LCD1602 程序: