QXMLStreamReader解析XML文件

streamparsexml.h
#ifndef STREAMPARSEXML_H
#define STREAMPARSEXML_H
 
#include <QWidget>
#include <QXmlStreamReader>
#include <QXmlStreamWriter>
#include <QFile>
#include <QMessageBox>
 
namespace Ui {
class StreamParseXml;
}
 
class StreamParseXml : public QWidget
{
    Q_OBJECT
 
public:
    explicit StreamParseXml(QWidget *parent = 0);
    ~StreamParseXml();
 
public:
    int writeXML();
    int readXML();
 
private:
    void parseUserInformation();
    QString getValue(const QString &name);
    QString getAttribute(const QString &name);
 
private:
    QString fileName;
    QXmlStreamReader *reader;
 
private:
    Ui::StreamParseXml *ui;
};
 
#endif // STREAMPARSEXML_H


streamparsexml.cpp
#include "streamparsexml.h"
#include "ui_streamparsexml.h"
#include <QDebug>
#include <QApplication>
 
StreamParseXml::StreamParseXml(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::StreamParseXml)
{
    ui->setupUi(this);
    fileName = qApp->applicationDirPath() + "streamparse.xml";
}
 
StreamParseXml::~StreamParseXml()
{
    delete ui;
}
 
int StreamParseXml::writeXML()
{
    QFile file(fileName);
    if(file.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        QXmlStreamWriter writer(&file);
        writer.setAutoFormatting(true);
        writer.writeStartDocument();
        writer.writeStartElement("COMMAND");
        writer.writeTextElement("OBJECT","USER");
        writer.writeTextElement("ACTION","LOGIN");
        writer.writeStartElement("DATA");
        writer.writeStartElement("USER");
        writer.writeAttribute("NAME","root");
        writer.writeAttribute("PASSWORD","123456");
        writer.writeEndElement();
        writer.writeEndElement();
        writer.writeEndElement();
        file.close();
    }
 
    return 0;
}
 
int StreamParseXml::readXML()
{
    if(fileName.isEmpty())
        return -2;
    QFile *file = new QFile(fileName);
    if(!file->open(QFile::ReadOnly | QFile::Text))
    {
        QMessageBox::information(NULL,QString("title"),QString("open error!"));
        return -1;
    }
    reader = new QXmlStreamReader(file);
    while(!reader->atEnd() && !reader->hasError())
    {
        QXmlStreamReader::TokenType token = reader->readNext();
        if(token == QXmlStreamReader::StartDocument)
        {
            continue;
        }
        if(reader->isStartElement() && reader->name() == "OBJECT")
        {
            QString elementText = reader->readElementText();
            if(elementText == "USER")
            {
                parseUserInformation();
                break;
            }
        }
    }
 
    if(reader->hasError())
    {
        qDebug() << reader->errorString();
    }
 
    reader->clear();
    delete reader;
    reader = NULL;
    return 0;
}
 
void StreamParseXml::parseUserInformation()
{
    QString elementString = getValue("ACTION");
    if(elementString == "LOGIN")
    {
        while(!reader->atEnd())
        {
            reader->readNext();
            if(reader->name() == "USER")
            {
                QXmlStreamAttributes attributes = reader->attributes();
                if(attributes.hasAttribute("NAME"))
                {
                    qDebug() << "USER=" << attributes.value("NAME").toString();
                }
                if(attributes.hasAttribute("PASSWORD"))
                {
                    qDebug() << "PASSWORD=" << attributes.value("PASSWORD").toString();
                }
            }
        }
    }
}
 
QString StreamParseXml::getValue(const QString &name)
{
    while(!reader->atEnd())
    {
        reader->readNext();
        if(reader->isStartElement() && reader->name() == name)
        {
            return reader->readElementText();
        }
    }
 
    return "";
}

main.cpp 
#include "streamparsexml.h"
#include <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    StreamParseXml w;
    w.writeXML();
    w.readXML();
 
    return a.exec();
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值