QXmlStreamReader与QXmlStreamWriter的使用

5 篇文章 0 订阅
1 篇文章 0 订阅

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());
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值