| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] QXmlStreamReader и функция clear() |
| Автор: null56 15.5.2009, 14:19 | ||
| Хотел поинтересовать такой вещью... Я создаю объект парсера и хочу его использовать несколько раз, но без уничтожения, то есть используя перегруженную функцию parse()
Все хорошо работает, пока у меня не появляются ошибки Xml, либо мои, либо стандарта, не важно... суть в том, что когда я пытаюсь использовать снова этот парсер, у меня данные предыдущие не очищаются, и парсить этим объектом не получается, хотя я как видите постоянно перед добавлением новых данных вызываю функцию clear(). Что я делаю не правильно и верно ли я использую эту функцию... Заранее благодарен за помощь |
| Автор: null56 21.5.2009, 22:34 | ||||||||
Ребята неужели парсер одноразовый, я не понимаю... вот тут кое что нашел по своей проблеме, не могли бы вы объяснить, что имели в виду троли описывая это...
я набросал простой пример, который выдает это же узкое место xmlparser.h
xmlparser.cpp
main.cpp
Задача примера, встретив тег с именем "preved" сгенерить ошибку "custom error", что он успешно и делает, но вот почему вводя правильные, для данного примера, входные данные во втором вызове метода parse происходит вылет с ошибкой PrematureEndOfDocumentError. глосащем о том, что нарушена структура, вот в этом вопрос. Правильно ли я использую данный парсер и почему происходит ошибка именно после того, как я генерю raiseError? ЗЫ: замечу, что изменив первые данные на другую пару тегов, оба процесса отработают Заранее благодарен за помощь всем откликнувшимся |
| Автор: SABROG 22.5.2009, 09:15 |
Если возникает ошибка, то дальнейшее чтение невозможно, функция atEnd() возвращает true и метод readNext() ничего не делает, но возвращает токен типа QXmlStreamReader::Invalid. Но есть одно исключение из этого правила. Ошибка типа QXmlStreamReader::PrematureEndOfDocumentError говорит о том, что был отпарсен кусок xml'я правильной структуры (например <preved>text</preved>, а не <preved>text<pr). И устройство ожидает получение следующего куска xml'я, который может качаться через интернет например. Как только кусок скачается его надо добавлять через метод addData и тогда парсинг можно возобновлять. С конструктором QXmlStreamReader::QXmlStreamReader ( QIODevice * device ) это естественно работать не будет. |
| Автор: null56 22.5.2009, 15:43 | ||
ну а я что делаю???
я очищаю старый контекст(clear), когда вызывается функция parse и добавляю новые данные, которые хочу распарсить с нуля (addData), данные передавались в качестве аргумента, почему выскакивает ошибка??? ведь последовательность вроде правильная parse -> clear -> addData, что ему не нравится? я не понимаю? |
| Автор: SABROG 22.5.2009, 16:23 |
Ты просил перевести, я перевел. Попробуй унаследоваться от QXmlSimpleReader. |
| Автор: null56 22.5.2009, 20:12 |
| SABROG, спасибо большое, это я так сам с собой разговариваю... просто не могу понять, что не получается |
| Автор: null56 23.5.2009, 23:30 |
| видимо не один я такой, возможно бага, которая уже решена http://www.qtsoftware.com/developer/task-tracker/index_html?method=entry&id=170748 Добавлено через 1 минуту и 6 секунд http://www.qtsoftware.com/developer/task-tracker/index_html?method=entry&id=179320 |
| Автор: null56 26.5.2009, 11:33 |
| Так и есть... Поставил версию Qt 4,5, парсер работает как надо |