MHandleXml.h
#pragma once
#include <QString>#include <QXmlStreamReader>
#include <QXmlStreamWriter>
#include <map>
#include "CommData.h"
#include <QMap>
class Message
{
public:
Message(const QString& strName, const QString& strPhone
, const QString& strContent, const QString& strTime)
: m_name(strName), m_phone(strPhone), m_content(strContent), m_time(strTime)
{
}
~Message() {}
private:
QString m_name;
QString m_phone;
QString m_content;
QString m_time;
public:
QString GetMsgName(void)
{
return m_name;
}
QString GetMsgPhone(void)
{
return m_phone;
}
QString GetMsgContent(void)
{
return m_content;
}
QString GetMsgTime(void)
{
return m_time;
}
};
class MHandleXml
{
public:
MHandleXml(const QString& strFilePath);
~MHandleXml(void);
private:
QString m_xmlPath;
std::multimap<QString, Message*> m_MsgMap;
void InitMsg(void);
QMap<QString, QString> parseMsgNote(QXmlStreamReader& xml);
void addElementDataToMap(QXmlStreamReader& xml,
QMap<QString, QString>& map) const;
public:
void ReadXml(void);
void WriteXml(void);
};
MHandleXml.cpp
#include "MHandleXml.h"
#include <QFile>
#include <assert.h>
#include <qdebug.h>
class Message;
MHandleXml::MHandleXml(const QString& strFilePath)
: m_xmlPath(strFilePath)
{
InitMsg();
}
MHandleXml::~MHandleXml(void)
{
std::multimap<QString, Message*>::iterator pos;
for(pos = m_MsgMap.begin(); pos != m_MsgMap.end(); pos++)
{
Message *message = pos->second;
if (message != NULL)
{
delete message;
message = NULL;
}
}
m_MsgMap.clear();
}
/****
func:初始化信息
author:yanfakui
date:2016-04-01
****/
void MHandleXml::InitMsg(void)
{
QString str;
str = "程序员";
m_MsgMap.insert(std::pair<QString, Message*>
("1", new Message("zhangsan", "15134698454", str, "2015-05-02 08:56:25")));
str = "会计师";
m_MsgMap.insert(std::pair<QString, Message*>
("2", new Message("lisi", "15332694754", str, "2015-05-04 08:56:23")));
str = "CEO";
m_MsgMap.insert(std::pair<QString, Message*>
("3", new Message("wanger", "15032628714", str, "2015-05-03 08:56:12")));
str = "农民";
m_MsgMap.insert(std::pair<QString, Message*>
("4", new Message("lilong", "15632398764", str, "2015-05-03 08:56:66")));
}
/****
func:读xml文件
****/
void MHandleXml::ReadXml(void)
{
if(m_xmlPath.isEmpty())
return;
QFile *file = new QFile(m_xmlPath);
if(!file->open(QFile::ReadOnly | QFile::Text))
{
qDebug("open error!");
return;
}
// QXmlStreamReader操作任何QIODevice.
QXmlStreamReader xml(file);
QList<QMap<QString, QString>> msgs;
// 解析XML,直到结束
while(!xml.atEnd() && !xml.hasError())
{
// 读取下一个element
QXmlStreamReader::TokenType token = xml.readNext();
// 如果获取的仅为StartDocument,则进行下一个
if(token == QXmlStreamReader::StartDocument)
{
continue;
}
// 如果获取了StartElement,则尝试读取
if(token == QXmlStreamReader::StartElement)
{
// 如果为DATA,直接进入下一个
if(xml.name() == "DATA")
{
continue;
}
// 如果为Msg,则对其进行解析
if(xml.name() == "Msg")
{
msgs.append(this->parseMsgNote(xml));
}
}
}
QString strContent = "Id Name Number Content Time\n" ;
if(xml.hasError())
{
qDebug(xml.errorString().toStdString().c_str());
}
else
{
QList<QMap<QString, QString>>::iterator ite = msgs.begin();
for (; ite != msgs.end(); ite++)
{
QMap<QString, QString> mapItem = *ite;
//QMap<QString, QString>::const_iterator cIter = mapItem.constBegin();
//for(; cIter != mapItem.constEnd(); cIter++)
//{
// strContent += cIter.value() + " ";
//}
//strContent += "\n";
strContent += mapItem["id"] + " " +mapItem["Name"] + " "
+ mapItem["Number"] + " " + mapItem["Content"] + " "
+ mapItem["Time"] + "\n";
}
}
qDebug(strContent.toStdString().c_str());
// 从reader中删除所有设备、数据,并将其重置为初始状态
xml.clear();
}
/****
func:写xml文件
****/
void MHandleXml::WriteXml(void)
{
QFile file(m_xmlPath);
assert(file.open(QIODevice::WriteOnly | QIODevice::Text));
QXmlStreamWriter writer(&file);
writer.setAutoFormatting(true);
writer.writeStartDocument();
writer.writeStartElement("DATA");
std::multimap<QString, Message*>::iterator pos;
int id = 1;
for(pos = m_MsgMap.begin(); pos != m_MsgMap.end(); pos++)
{
Message *message = pos->second;
writer.writeStartElement("Msg");
writer.writeAttribute("id", QString::number(id++));
writer.writeTextElement("Name", message->GetMsgName());
writer.writeTextElement("Number", message->GetMsgPhone());
writer.writeTextElement("Content", message->GetMsgContent());
writer.writeTextElement("Time", message->GetMsgTime());
writer.writeEndElement();
}
writer.writeEndElement();
writer.writeEndDocument();
file.close();
}
/****
func:解析xml的元素节点
****/
QMap<QString, QString> MHandleXml::parseMsgNote(QXmlStreamReader& xml)
{
QMap<QString, QString> msg;
// 检查是否获取Msg
if(xml.tokenType() != QXmlStreamReader::StartElement &&
xml.name() == "Msg")
{
return msg;
}
// 获取Msg属性
QXmlStreamAttributes attributes = xml.attributes();
if(attributes.hasAttribute("id"))
{
//msg["id"] = attributes.value("id").toString();
msg.insert("id", attributes.value("id").toString());
}
// 操作下一个
xml.readNext();
while(!(xml.tokenType() == QXmlStreamReader::EndElement &&
xml.name() == "Msg"))
{
if(xml.tokenType() == QXmlStreamReader::StartElement)
{
if(xml.name() == "Name")
{
this->addElementDataToMap(xml, msg);
}
if(xml.name() == "Number")
{
this->addElementDataToMap(xml, msg);
}
if(xml.name() == "Content")
{
this->addElementDataToMap(xml, msg);
}
if(xml.name() == "Time")
{
this->addElementDataToMap(xml, msg);
}
}
xml.readNext();
}
return msg;
}
/****
func:将当前节点的内容(键-值)添加到map中
****/
void MHandleXml::addElementDataToMap(QXmlStreamReader& xml,
QMap<QString, QString>& map) const
{
if(xml.tokenType() != QXmlStreamReader::StartElement)
{
return;
}
QString elementName = xml.name().toString();
xml.readNext();
if(xml.tokenType() != QXmlStreamReader::Characters)
{
return;
}
map.insert(elementName, xml.text().toString());
}