C++ Qt скачка по http xml файла

Disastricks

Вопрос такой. Можно ли по http скачать xml файл в буфер, открыть файл расположенный в буфере для чтения и распарсить его? Щас сделано так, приходится скачивать сам файл, располагать его в кталоге с проектоми там уже открывать через QFile для чтения и дальнейшего его парсинга. Как будет выглядеть код скачивания xml с сайта в буфер и начало его парсинга?

2 ответа

Disastricks

план мероприятий:)

  1. Добавьте QNetworkAccessManager в include и как поле класса. пусть его имя будет manager.
  2. Подпишитесь на finisherd

    connect(&manager, &QNetworkAccessManager::finished, this, &loader::finished);

  3. В нужном месте добавьте запрос

    QNetworkRequest r(QUrl("http://url-to-podcast")); manager.get(r);

  4. в finished пишем обработку

    void loader::finished(QNetworkReply *reply)
    { // так как reply это QIODevice, а xml ридер умеет с него загружаться, то можно прямо так QXmlStreamReader xml(reply); // не забыть почистить ресурсы reply->deleteLater(); // читаем поэлементно наш xml while (!xml.atEnd() && !xml.hasError()) { QXmlStreamReader::TokenType token = xml.readNext(); if (token == QXmlStreamReader::StartDocument) continue; // если это начало нового элемента if (token == QXmlStreamReader::StartElement) { // и это item if (xml.name() == "item") // распарсим и выведем! qDebug() << parseOneItem(xml); } }
    }

ну и собственно сам парсер элемента

QString Foo::parseOneItem(QXmlStreamReader &xml)
{ QString s; xml.readNext(); while (!(xml.tokenType() == QXmlStreamReader::EndElement && xml.name() == "item")) { if (xml.tokenType() == QXmlStreamReader::StartElement) { if (xml.name() == "title") { xml.readNext(); QString t = xml.text().toUtf8(); s += QString("title %1").arg(t); } if (xml.name() == "link") { xml.readNext(); QString t = xml.text().toUtf8(); s += QString("link %1").arg(t); } } xml.readNext(); } return s;
}

если кто не догадался, то парсятся xml от подкастов


Disastricks

Если это нужно для пользовательского интерфейса, порекомендую вам использовать QML, http://doc.qt.io/qt-5/qml-qtquick-xmllistmodel-xmllistmodel.html

licensed under cc by-sa 3.0 with attribution.