Russian Qt Forum
Ноябрь 22, 2024, 22:34
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
XML
>
класс для парсинга XML
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: класс для парсинга XML (Прочитано 8152 раз)
zoro86
Гость
класс для парсинга XML
«
:
Февраль 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
Гость
Re: класс для парсинга XML
«
Ответ #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
Гость
Re: класс для парсинга XML
«
Ответ #2 :
Февраль 12, 2010, 10:01 »
Если тебе нужно только парсить, не нужно возвращаться на назад по иерархии тегов и важна скорость обработки, то возьми лучше StAX парсер - QXmlStreamReader.
Записан
SASA
Гость
Re: класс для парсинга XML
«
Ответ #3 :
Февраль 12, 2010, 12:49 »
Цитата: zoro86 от Февраль 12, 2010, 08:51
Есть необходимость создания класса для парсинга XML и возвращения QMap вида QMap<int ,QMap<QString,QString>>
По-моему это DOM в чистом виде. Легче написать обертку над QDomNode, чтоб получать данные в нужном виде.
Записан
lit-uriy
Джедай : наставник для всех
Offline
Сообщений: 3880
Re: класс для парсинга XML
«
Ответ #4 :
Февраль 12, 2010, 15:06 »
>>то возьми лучше SAX парсер - QXmlStreamReader.
Мой эксперимент с SAX и DOM на xml-файле весом в 27 метров, показал, что на чтение нет ни какой разницы в скорости.
Записан
Юра.
SABROG
Гость
Re: класс для парсинга XML
«
Ответ #5 :
Февраль 12, 2010, 23:34 »
Цитата: lit-uriy от Февраль 12, 2010, 15:06
>>то возьми лучше SAX парсер - QXmlStreamReader.
Мой эксперимент с SAX и DOM на xml-файле весом в 27 метров, показал, что на чтение нет ни какой разницы в скорости.
А памяти как кушает?
P.S.: зря исправил StAX на SAX, это несколько разные вещи. StAX лучше тем, что можно парсить данные по мере поступления, из сети скажем, не заботясь о целостности всего xml файла.
Записан
lit-uriy
Джедай : наставник для всех
Offline
Сообщений: 3880
Re: класс для парсинга XML
«
Ответ #6 :
Февраль 13, 2010, 01:37 »
>>А памяти как кушает?
Не смотрел, но могу покапатся, вроде оба теста у меня сохранились, и выложить исходники, если надо. Они основаны на двух примерах Qt, "SAX Boorkmak" и "DOM Boorkmak"
>>зря исправил StAX на SAX
Я думал это опечатка, а что такое StAX?
Записан
Юра.
SABROG
Гость
Re: класс для парсинга XML
«
Ответ #7 :
Февраль 13, 2010, 03:25 »
SAX - Simple API for XML
StAX - Streaming API for XML
У них даже принцип работы разный.
SAX это push парсер, он основан на эвентах и калбэках. Встретился тег - вызывается твой каллбэк и ты уже решаешь, что с ним делать. Т.е. парсер как бы "толкает" теги в твою процедуру.
StAX это pull парсер, он как бы "выталкивает" теги из парсера, обычно это выглядит как самостоятельный вызов метода, который возвращает имя тега.
Записан
zoro86
Гость
Re: класс для парсинга XML
«
Ответ #8 :
Февраль 15, 2010, 07:30 »
Я тут уже накатал парсер используя дом... у меня тут xml максимум до 70kB в размере, поступает с сервера когда меняется хешь файл, или перезапускается прога... файл является файлом конфигурации, на основе него выресовывается прога... спосибо за советы..
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...