#include "ctxml.h"
#include <QDomDocument>
#include <QFile>
#include <QXmlStreamReader>
#include <QXmlStreamWriter>
CtXml::CtXml()
{
}
CtXml::~CtXml()
{
}
CtXml &CtXml::getInstance()
{
static CtXml s_obj;
return s_obj;
}
void CtXml::on_writeToXmlFileWithDom(PERSION_T stPersion)
{
QDomDocument dDoc;
QString sHeader("version=\"1.0\" encoding=\"UTF-8\"");
dDoc.appendChild(dDoc.createProcessingInstruction("xml", sHeader));//生成说明
//生成根节点
QDomElement sRootElement = dDoc.createElement("Root");
dDoc.appendChild(sRootElement);
QDomElement PersionElement = dDoc.createElement("Persion");
QDomElement Item1Element = dDoc.createElement("Item");
Item1Element.setAttribute("Name", "Name");
Item1Element.setAttribute("Type", "QString");
QDomText Item1Text = dDoc.createTextNode("Item");
Item1Text.setData(stPersion.sName);
Item1Element.appendChild(Item1Text);
PersionElement.appendChild(Item1Element);
QDomElement Item2Element = dDoc.createElement("Item");
Item2Element.setAttribute("Name", "Age");
Item2Element.setAttribute("Type", "Int");
QDomText Item2Text = dDoc.createTextNode("Item");
Item2Text.setData(QString::number(stPersion.nAge));
Item2Element.appendChild(Item2Text);
PersionElement.appendChild(Item2Element);
QDomElement Item3Element = dDoc.createElement("Item");
Item3Element.setAttribute("Name", "Sex");
Item3Element.setAttribute("Type", "QString");
QDomText Item3Text = dDoc.createTextNode("Item");
Item3Text.setData(stPersion.Sex);
Item3Element.appendChild(Item3Text);
PersionElement.appendChild(Item3Element);
QDomElement Item4Element = dDoc.createElement("Item");
Item4Element.setAttribute("Name", "Height");
Item4Element.setAttribute("Type", "Int");
QDomText Item4Text = dDoc.createTextNode("Item");
Item4Text.setData(QString::number(stPersion.nHeight));
Item4Element.appendChild(Item4Text);
PersionElement.appendChild(Item4Element);
QDomElement Item5Element = dDoc.createElement("Item");
Item5Element.setAttribute("Name", "Weight");
Item5Element.setAttribute("Type", "Int");
QDomText Item5Text = dDoc.createTextNode("Item");
Item5Text.setData(QString::number(stPersion.nWeight));
Item5Element.appendChild(Item5Text);
PersionElement.appendChild(Item5Element);
sRootElement.appendChild(PersionElement);
QFile file(XML_FILE_PATH);
if(!file.open(QFile::WriteOnly | QFile::Text | QFile :: Truncate))//Truncate:覆盖重写
{
MY_DEBUG << "Open XML File Failed";
return;
}
file.write(dDoc.toString().toLocal8Bit().data());
file.close();
}
void CtXml::on_readFromXmlFileWithDom()
{
QDomDocument dDoc;
QFile file(XML_FILE_PATH);
if(!file.open(QFile::ReadOnly | QFile::Text))
{
MY_DEBUG << "Open XML File Failed";
return;
}
int iErrorLine;
int iErrorCol;
QString sErrorMsg;
if (!dDoc.setContent(&file, false, &sErrorMsg, &iErrorLine, &iErrorCol))
{
sErrorMsg = QString::fromLocal8Bit("Parse Failed.");
MY_DEBUG << "sErrorMsg:" << sErrorMsg;
file.close();
return;
}
file.close();
PERSION_T stPersion;
QDomElement deRootNode = dDoc.documentElement();
if(deRootNode.tagName() == "Root")
{
MY_DEBUG << "readFromXmlFileWithDom 000";
QDomNode PersionNode = deRootNode.firstChild();
while(!PersionNode.isNull())
{
MY_DEBUG << "readFromXmlFileWithDom 111";
QString sPersion = PersionNode.toElement().tagName();
if(!sPersion.compare("Persion"))
{
MY_DEBUG << "readFromXmlFileWithDom 222";
QDomNodeList ItemNodeList = PersionNode.childNodes();
for(int i = 0; i < ItemNodeList.size(); i++)
{
MY_DEBUG << "readFromXmlFileWithDom 333";
QDomElement ItemElement = ItemNodeList.at(i).toElement();
if(!ItemElement.tagName().compare("Item"))
{
MY_DEBUG << "readFromXmlFileWithDom 444";
if(ItemElement.hasAttribute("Name"))
{
MY_DEBUG << "readFromXmlFileWithDom 555";
QString str = ItemElement.attribute("Name");
if(!str.compare("Name"))
{
stPersion.sName = ItemElement.text();
}
else if(!str.compare("Age"))
{
stPersion.nAge = ItemElement.text().toInt();
}
else if(!str.compare("Sex"))
{
stPersion.Sex = ItemElement.text();
}
else if(!str.compare("Height"))
{
stPersion.nHeight = ItemElement.text().toInt();
}
else if(!str.compare("Weight"))
{
stPersion.nWeight = ItemElement.text().toInt();
}
}
}
}
}
PersionNode = PersionNode.nextSibling();
}
}
emit sig_returnXmlData(stPersion);
}
void CtXml::on_writeToXmlFileWithSax(PERSION_T stPersion)
{
QFile file(XML_FILE_PATH2);
if(!file.open(QFile::WriteOnly | QFile::Text | QFile :: Truncate))
{
MY_DEBUG << "XML File Open Failed.";
return;
}
QXmlStreamWriter xmlWrite(&file);
xmlWrite.setAutoFormatting(true);
xmlWrite.writeStartDocument("1.0",true);
xmlWrite.writeStartElement("Root");
xmlWrite.writeStartElement("Persion");
xmlWrite.writeStartElement ("Item");
xmlWrite.writeAttribute("Name","Name");
xmlWrite.writeAttribute("Type","QString");
xmlWrite.writeCharacters(stPersion.sName);
xmlWrite.writeEndElement();
xmlWrite.writeStartElement ("Item");
xmlWrite.writeAttribute("Name","Age");
xmlWrite.writeAttribute("Type","Int");
xmlWrite.writeCharacters(QString::number(stPersion.nAge));
xmlWrite.writeEndElement();
xmlWrite.writeStartElement ("Item");
xmlWrite.writeAttribute("Name","Sex");
xmlWrite.writeAttribute("Type","QString");
xmlWrite.writeCharacters(stPersion.Sex);
xmlWrite.writeEndElement();
xmlWrite.writeStartElement ("Item");
xmlWrite.writeAttribute("Name","Height");
xmlWrite.writeAttribute("Type","Int");
xmlWrite.writeCharacters(QString::number(stPersion.nHeight));
xmlWrite.writeEndElement();
xmlWrite.writeStartElement ("Item");
xmlWrite.writeAttribute("Name","Weight");
xmlWrite.writeAttribute("Type","Int");
xmlWrite.writeCharacters(QString::number(stPersion.nWeight));
xmlWrite.writeEndElement();
xmlWrite.writeEndElement(); //Persion结束
xmlWrite.writeEndElement(); //Root结束
xmlWrite.writeEndDocument(); //Document结束
file.close();
}
void CtXml::on_readFormXmlFileWithSax()
{
QFile file(XML_FILE_PATH2);
if(!file.open(QFile::ReadOnly | QFile::Text))
{
MY_DEBUG << "XML File Open Failed.";
return;
}
PERSION_T stPersion;
QXmlStreamReader xmlRead;
xmlRead.setDevice(&file);
if(xmlRead.readNextStartElement())
{
if(xmlRead.name().toString() == "Root")
{
if(xmlRead.readNextStartElement())
{
if(xmlRead.name().toString()
qt使用DOM和SAX两种方式读写XML文件,代码工程demo,亲测可用
需积分: 9 170 浏览量
2023-01-09
11:00:07
上传
评论
收藏 1.08MB RAR 举报
浅笑一斤
- 粉丝: 1w+
- 资源: 61
最新资源
- 笔记实验六,spark,大数据分析
- ####蓝桥杯python的详细的信息介绍
- 电子万年历软件仿真(经过多次修改,保证正确性)
- Unity XR 手势射击控制脚本(适用于任何可手势识别的设备)
- 机械设计全自动电表(NB和IC卡表)控制和上壳装配线sw16可编辑非常好的设计图纸100%好用.zip
- 基于matlab的EAN-13条形码识别系统GUI界面.zip代码53
- matlab基于bp神经网络交通信号标志识别GUI界面13个标志.zip代码54
- 电子万年历答辩实物展示视频mp4格式
- 基于python实现的程序,包括哈希感知算法cvHash,图像切割cvsplit,固定目标检测cvRec(附文档ppt)等
- 计算0-10000之间所有偶数的和
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈