Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] QXmlStreamReader и функция clear(), Не отрабатывает функция или что - то так 
V
    Опции темы
null56
Дата 15.5.2009, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Хотел поинтересовать такой вещью...
Я создаю объект парсера и хочу его использовать несколько раз, но без уничтожения, то есть используя перегруженную функцию parse()
Код

inline bool XmlParser :: parse(const QByteArray & rXml)
{
    if (rXml.isEmpty()) { return false; }
    clear();
    addData(rXml);
    while (!atEnd())
    {
        switch (readNext())
        {
            case(StartElement): { ... break; }
            case(EndDocument): { ... break; }
            case(Characters): {... break; }
            default: break;
        }
    }
    if (hasError())
        { qDebug("Error message: %s", errorString().toStdString().c_str()); return false; }
    return true;
}

Все хорошо работает, пока у меня не появляются ошибки Xml, либо мои, либо стандарта, не важно... суть в том, что когда я пытаюсь использовать снова этот парсер, у меня данные предыдущие не очищаются, и парсить этим объектом не получается, хотя я как видите постоянно перед добавлением новых данных вызываю функцию clear().

Что я делаю не правильно и верно ли я использую эту функцию...
Заранее благодарен за помощь
PM MAIL   Вверх
null56
Дата 21.5.2009, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Ребята неужели парсер одноразовый, я не понимаю... вот тут кое что нашел по своей проблеме, не могли бы вы объяснить, что имели в виду троли описывая это...
Цитата

TokenType QXmlStreamReader::readNext ()

Reads the next token and returns its type.

If an error() has been reported, reading is no longer possible. In this case, atEnd() always returns true, and this function will do nothing but return Invalid.

The one exception to this rule are errors of type PrematureEndOfDocumentError. Subsequent calls to atEnd() and readNext() will resume this error type and try to read from the device again. This iterative parsing approach makes sense if you can't or don't want to read the entire data in one go, for example, if it is huge, or it is being delivered over a network connection


я набросал простой пример, который выдает это же узкое место
xmlparser.h
Код

class XmlParser : public QXmlStreamReader
{
public:
    XmlParser();
    bool parse(const QByteArray & rXml);
    void onStartElement(const QString & rName);
    void onEndDocument();
};

xmlparser.cpp
Код

#include "xmlparser.h"

XmlParser::XmlParser()
{
}

bool XmlParser :: parse(const QByteArray & rXml)
{
        clear();
        addData(rXml);
        while (!atEnd())
        {
                switch (readNext())
                {
                case(StartElement): { onStartElement(name().toString()); break; }
                case(EndDocument): { onEndDocument(); break; }
                default: {}
                }
        }
        if (hasError())
            { qDebug("Error message: %s", errorString().toStdString().c_str()); }
        return true;
}

void XmlParser :: onStartElement(const QString & rName)
{
    if (rName == "preved")
        { qDebug("my raise"); raiseError("custom error"); }
}

void XmlParser :: onEndDocument()
{
    qDebug("On end document");
}

main.cpp
Код

#include <QtCore/QCoreApplication>
#include "xmlparser.h"
int main(int argc, char *argv[])
{
    XmlParser parse;
    parse.parse("<preved></preved>");
    parse.parse("<preved1></preved1>");
    return 0;
}

Задача примера, встретив тег с именем "preved" сгенерить ошибку "custom error", что он успешно и делает, но вот почему вводя правильные, для данного примера, входные данные во втором вызове метода parse происходит вылет с ошибкой PrematureEndOfDocumentError. глосащем о том, что нарушена структура, вот в этом вопрос.
Правильно ли я использую данный парсер и почему происходит ошибка именно после того, как я генерю raiseError?

ЗЫ: замечу, что изменив первые данные на другую пару тегов, оба процесса отработают

Заранее благодарен за помощь всем откликнувшимся
PM MAIL   Вверх
SABROG
Дата 22.5.2009, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(null56 @  21.5.2009,  22:34 Найти цитируемый пост)
что имели в виду троли описывая это...

Если возникает ошибка, то дальнейшее чтение невозможно, функция atEnd() возвращает true и метод readNext() ничего не делает, но возвращает токен типа QXmlStreamReader::Invalid.

Но есть одно исключение из этого правила. Ошибка типа QXmlStreamReader::PrematureEndOfDocumentError говорит о том, что был отпарсен кусок xml'я правильной структуры (например <preved>text</preved>, а не <preved>text<pr). И устройство ожидает получение следующего куска xml'я, который может качаться через интернет например. Как только кусок скачается его надо добавлять через метод addData и тогда парсинг можно возобновлять. С конструктором QXmlStreamReader::QXmlStreamReader ( QIODevice * device ) это естественно работать не будет.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
null56
Дата 22.5.2009, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



ну а я что делаю???
Код

        clear();
        addData(rXml);


я очищаю старый контекст(clear), когда вызывается функция parse и добавляю новые данные, которые хочу распарсить с нуля (addData), данные передавались в качестве аргумента, почему выскакивает ошибка??? ведь последовательность вроде правильная parse -> clear -> addData, что ему не нравится? я не понимаю?
PM MAIL   Вверх
SABROG
Дата 22.5.2009, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(null56 @  22.5.2009,  15:43 Найти цитируемый пост)
ну а я что делаю???

Ты просил перевести, я перевел.

Попробуй унаследоваться от QXmlSimpleReader.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
null56
Дата 22.5.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



SABROG, спасибо большое, это я так сам с собой разговариваю... просто не могу понять, что не получается

Это сообщение отредактировал(а) null56 - 22.5.2009, 20:12
PM MAIL   Вверх
null56
Дата 23.5.2009, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



видимо не один я такой, возможно бага, которая уже решена
http://www.qtsoftware.com/developer/task-t...y&id=170748

Добавлено через 1 минуту и 6 секунд
http://www.qtsoftware.com/developer/task-t...y&id=179320
PM MAIL   Вверх
null56
Дата 26.5.2009, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Так и есть...
Поставил версию Qt 4,5, парсер работает как надо
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0540 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.