Название: класс для парсинга 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 в размере, поступает с сервера когда меняется хешь файл, или перезапускается прога... файл является файлом конфигурации, на основе него выресовывается прога... спосибо за советы..
|