Russian Qt Forum

Qt => XML => Тема начата: zoro86 от Февраль 12, 2010, 08:51



Название: класс для парсинга XML
Отправлено: zoro86 от Февраль 12, 2010, 08:51
Есть необходимость создания класса для парсинга XML и возвращения QMap вида QMap<int ,QMap<QString,QString>>
скажу сразу что я только на С и на РНР программировал, есть набросок header.

#ifndef _SHABLONXML_H_
#define _SHABLONXML_H_

#include <QtXml>
#include <QtCore>

class QMap;

class ShablonXml{
   
   Q_OBJECT
   
public:
   ShablonXml(const QString& strXmlName);
   
   void openDocumentXml();
   void traverseNode();
   
   QString fileName;
signals:
   void xmlParsOk(const QMap<int ,QMap<QString,QString>>& map);

//public slots:      
   
}


#endif // !_SHABLONXML_H_

направьте пожалуйста на правильный путь если я не правильно что та делаю...
и какие необходимо включать классы для реализации данного класса?


Название: Re: класс для парсинга XML
Отправлено: zoro86 от Февраль 12, 2010, 09:56
В общем пришлось сделать так
#ifndef _SHABLONXML_H_
#define _SHABLONXML_H_

#include <QWidget>
#include <QtXml>
#include <QtCore>

class ShablonXml:  public QWidget{
   
   Q_OBJECT
   
public:
   ShablonXml(const QString& strXmlName, QWidget* parent = 0);
   
   void openDocumentXml();
   void traverseNode(const QDomNode& node);
   
   QString fileName;
signals:
   void xmlParsOk(const QMap<int, QMap<QString, QString > >& map);

//public slots:      
   
};


#endif // !_SHABLONXML_H_

и

#include <QtGui>
#include <QtXml>
#include <QTextStream>
#include <QtDebug>
#include "shablonXml.h"

ShablonXml::ShablonXml(const QString& strXmlName, QWidget *parent):QWidget(parent)
{
   QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8"));
   
   fileName = strXmlName;
   
   openDocumentXml();
}



void ShablonXml::openDocumentXml()
{
    QDomDocument doc;
    QFile file(fileName);
    if (!file.open(QIODevice::ReadOnly))
    return;
    if (!doc.setContent(&file)) {
       file.close();
       qDebug() << "Неудалось открыть файл";
       return;
    }else{
       qDebug() << "Файл открыт успешно";
       
       QDomElement domElement = doc.documentElement();
       
       traverseNode(domElement);
       
       
    }
   
   file.close();
   
}

void ShablonXml::traverseNode(const QDomNode& node)
{
   QDomNode domNode = node.firstChild();
   
   while(!domNode.isNull())
   {
      if(domNode.isElement()){
         QDomElement domElement = domNode.toElement();
         
         if(!domElement.isNull()){
            qDebug() << domElement.tagName();
            
         }
         
      }
      traverseNode(domNode);
      domNode = domNode.nextSibling();
   }
}

вроде парсит теперь попробую елементы в QMap Загнать и отправить с сигналом..


Название: Re: класс для парсинга XML
Отправлено: SABROG от Февраль 12, 2010, 10:01
Если тебе нужно только парсить, не нужно возвращаться на назад по иерархии тегов и важна скорость обработки, то возьми лучше StAX парсер - QXmlStreamReader.


Название: Re: класс для парсинга XML
Отправлено: SASA от Февраль 12, 2010, 12:49
Есть необходимость создания класса для парсинга XML и возвращения QMap вида QMap<int ,QMap<QString,QString>>

По-моему это DOM в чистом виде. Легче написать обертку над QDomNode, чтоб получать данные в нужном виде.


Название: Re: класс для парсинга XML
Отправлено: lit-uriy от Февраль 12, 2010, 15:06
>>то возьми лучше SAX парсер - QXmlStreamReader.
Мой эксперимент с SAX и DOM на xml-файле весом в 27 метров, показал, что на чтение нет ни какой разницы в скорости.


Название: Re: класс для парсинга XML
Отправлено: SABROG от Февраль 12, 2010, 23:34
>>то возьми лучше SAX парсер - QXmlStreamReader.
Мой эксперимент с SAX и DOM на xml-файле весом в 27 метров, показал, что на чтение нет ни какой разницы в скорости.

А памяти как кушает?

P.S.: зря исправил StAX на SAX, это несколько разные вещи. StAX лучше тем, что можно парсить данные по мере поступления, из сети скажем, не заботясь о целостности всего xml файла.


Название: Re: класс для парсинга XML
Отправлено: lit-uriy от Февраль 13, 2010, 01:37
>>А памяти как кушает?
Не смотрел, но могу покапатся, вроде оба теста у меня сохранились, и выложить исходники, если надо. Они основаны на двух примерах Qt, "SAX Boorkmak" и "DOM Boorkmak"

>>зря исправил StAX на SAX
Я думал это опечатка, а что такое StAX?


Название: Re: класс для парсинга XML
Отправлено: SABROG от Февраль 13, 2010, 03:25
SAX - Simple API for XML
StAX - Streaming API for XML

У них даже принцип работы разный.
SAX это push парсер, он основан на эвентах и калбэках. Встретился тег - вызывается твой каллбэк и ты уже решаешь, что с ним делать. Т.е. парсер как бы "толкает" теги в твою процедуру.

StAX это pull парсер, он как бы "выталкивает" теги из парсера, обычно это выглядит как самостоятельный вызов метода, который возвращает имя тега.


Название: Re: класс для парсинга XML
Отправлено: zoro86 от Февраль 15, 2010, 07:30
Я тут уже накатал парсер используя дом... у меня тут xml максимум до 70kB в размере, поступает с сервера когда меняется хешь файл, или перезапускается прога... файл является файлом конфигурации, на основе него выресовывается прога... спосибо за советы..