Russian Qt Forum
Сентябрь 21, 2024, 14:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: класс для парсинга XML  (Прочитано 8090 раз)
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_

направьте пожалуйста на правильный путь если я не правильно что та делаю...
и какие необходимо включать классы для реализации данного класса?
Записан
zoro86
Гость
« Ответ #1 : Февраль 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 Загнать и отправить с сигналом..
Записан
SABROG
Гость
« Ответ #2 : Февраль 12, 2010, 10:01 »

Если тебе нужно только парсить, не нужно возвращаться на назад по иерархии тегов и важна скорость обработки, то возьми лучше StAX парсер - QXmlStreamReader.
Записан
SASA
Гость
« Ответ #3 : Февраль 12, 2010, 12:49 »

Есть необходимость создания класса для парсинга XML и возвращения QMap вида QMap<int ,QMap<QString,QString>>

По-моему это DOM в чистом виде. Легче написать обертку над QDomNode, чтоб получать данные в нужном виде.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Февраль 12, 2010, 15:06 »

>>то возьми лучше SAX парсер - QXmlStreamReader.
Мой эксперимент с SAX и DOM на xml-файле весом в 27 метров, показал, что на чтение нет ни какой разницы в скорости.
Записан

Юра.
SABROG
Гость
« Ответ #5 : Февраль 12, 2010, 23:34 »

>>то возьми лучше SAX парсер - QXmlStreamReader.
Мой эксперимент с SAX и DOM на xml-файле весом в 27 метров, показал, что на чтение нет ни какой разницы в скорости.

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

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

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Февраль 13, 2010, 01:37 »

>>А памяти как кушает?
Не смотрел, но могу покапатся, вроде оба теста у меня сохранились, и выложить исходники, если надо. Они основаны на двух примерах Qt, "SAX Boorkmak" и "DOM Boorkmak"

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

Юра.
SABROG
Гость
« Ответ #7 : Февраль 13, 2010, 03:25 »

SAX - Simple API for XML
StAX - Streaming API for XML

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

StAX это pull парсер, он как бы "выталкивает" теги из парсера, обычно это выглядит как самостоятельный вызов метода, который возвращает имя тега.
Записан
zoro86
Гость
« Ответ #8 : Февраль 15, 2010, 07:30 »

Я тут уже накатал парсер используя дом... у меня тут xml максимум до 70kB в размере, поступает с сервера когда меняется хешь файл, или перезапускается прога... файл является файлом конфигурации, на основе него выресовывается прога... спосибо за советы..
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 23.