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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] QDomDocument отрабатывает не всегда=(  (Прочитано 6275 раз)
spirits25
Гость
« : Январь 18, 2013, 15:03 »

Всем привет!

Есть несколько методов в классе. В одном создаётся запрос и посылается:
Код:
    QNetworkRequest request;
    request.setUrl(url);
    request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    request.setRawHeader("Content-Type", "text/xml");

//    networkManager = new QNetworkAccessManager (this); //создаётся в конструкторе
    QNetworkReply* reply = networkManager->get(request);
    connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
            this, SLOT(getError(QNetworkReply::NetworkError)));

Далее сам slotReadyRead:
Код:
    QNetworkReply *reply=qobject_cast<QNetworkReply*>(sender());
    disconnect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
    disconnect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
               this, SLOT(getError(QNetworkReply::NetworkError)));

    int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();

    qDebug() << "=================================";
    if (reply->error() == QNetworkReply::NoError)
    {
        qDebug() << "status code: " << statusCode;
        switch (statusCode)
        {
            case 200:
            {
                QByteArray bytes = reply->readAll();
                QString XMLstring(bytes);

                if (!mDocument.setContent(bytes))
                {
                    qDebug() << "Error XML";
                    return ;
                }

                QDomElement  mElement = mDocument.documentElement().firstChildElement("Product");
                while ( !mElement.isNull() )
                {
                    QDomElement de = mElement.firstChildElement("ProductName");
                    productsList << de.text();
                    mElement = mElement.nextSiblingElement("Product");
                }
            }
        }
    }

Примерно вот так. И что получается - если дисконнекты не поставил бы, то метод вызывается 2 раза. Но ладно, дисконнект помог.

Проблема - Когда прогу запускаешь со включенной сетью - всё круто. Если сети не было, а метод вызываешь когда сеть появилась, то отрабатывает условие !mDocument.setContent(bytes), хотя в переменной XMLstring все данные на вид пришли. Что может быть не так? что стоит попробовать? Любые советы=)
« Последнее редактирование: Январь 18, 2013, 16:31 от spirits25 » Записан
_OLEGator_
Гость
« Ответ #1 : Январь 18, 2013, 15:12 »

Смотреть какие ошибки (errorMsg, errorLine, errorColumn) возвращает функция:
Код
C++ (Qt)
bool QDomDocument::setContent ( const QByteArray & buffer, QString * errorMsg = 0, int * errorLine = 0, int * errorColumn = 0 )
« Последнее редактирование: Январь 18, 2013, 15:17 от _OLEGator_ » Записан
spirits25
Гость
« Ответ #2 : Январь 18, 2013, 15:18 »

Смотреть какие ошибки (errorMsg, errorLine, errorColumn) возвращает функция:
Код
C++ (Qt)
bool QDomDocument::setContent ( const QString & text, QString * errorMsg = 0, int * errorLine = 0, int * errorColumn = 0 )


Код:
         
                qDebug() << "status code: " << statusCode;
                ................
                QDomDocument mDocument;
                bool namespaceProcessing;
                QString * errorMsg;
                int * errorLine;
                int * errorColumn;
                if (!mDocument.setContent(bytes, namespaceProcessing, errorMsg, errorLine, errorColumn))
                {
                    qDebug() << "Error XML";
                    qDebug() << errorMsg;
                    qDebug() << errorLine;
                    qDebug() << errorColumn;
                    return ;
                }

Выдало:
Цитировать
status code:  200
Error XML
0x0
0x0
0x0
Записан
_OLEGator_
Гость
« Ответ #3 : Январь 18, 2013, 15:19 »

+ еще учить плюсы.
как минимум надо инициализировать и разыменовать указатели errorMsg, errorLine, errorColumn. Я удивлен, что этот код еще и не падает.
Записан
spirits25
Гость
« Ответ #4 : Январь 18, 2013, 15:29 »

+ еще учить плюсы.
как минимум надо инициализировать и разыменовать указатели errorMsg, errorLine, errorColumn. Я удивлен, что этот код еще и не падает.

Есть такое=) после питона каждый раз долго к сям привыкаю. Спасибо.

Итого я имею
Цитировать
"unexpected end of file"
35
491
И действительно, заметил, что xml неполный, резко обрывается: "...s>false<". Почему такое может быть? ведь при первом соединении с сетью всё нормально.
Записан
_OLEGator_
Гость
« Ответ #5 : Январь 18, 2013, 15:47 »

Наверняка пришли не все данные, а только их часть.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Январь 18, 2013, 15:49 »

То, что ты попал в slotReadyRead, еще не значит, что все данные пришли. Юзай буфер.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
spirits25
Гость
« Ответ #7 : Январь 18, 2013, 16:11 »

То, что ты попал в slotReadyRead, еще не значит, что все данные пришли. Юзай буфер.

reply->readAll() разве не должен подождать всех данных? как заюзать буфер?
Записан
spirits25
Гость
« Ответ #8 : Январь 18, 2013, 16:12 »

Наверняка пришли не все данные, а только их часть.

Между запросами нет разницы. То есть может быть, что в одной ситуации пришли все данные, а в другой пришла только часть?
Записан
spirits25
Гость
« Ответ #9 : Январь 18, 2013, 16:17 »

все последующие запросы выводят
Цитировать
"unexpected end of file"
16
1658

То есть ещё меньше данных приходит. Больше значения не изменяются.
Записан
spirits25
Гость
« Ответ #10 : Январь 18, 2013, 16:31 »

Решил, может кому ещё из новичков пригодится=)
Ответы начали приходить в несколько заходов.
Каждый раз в slotReadyRead я сохранял по кусочку и когда всё собралось mDocument.setContent отработал без ошибок=)

Всем спасибо, кто помогал=)
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #11 : Январь 21, 2013, 12:53 »

а когда Вы узнали что пришли все данные?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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