我想解析Qt中的一些XML文件,但该文件位于Web中的某个服务器上。当我使用QML时,我能够使用XMLHttpRequest
类,它接受互联网上的文件地址(我需要)。来自Internet和Qt的XML文件
我只有一个想法:使用网络请求并直接下载该XML。这个想法可能是qt中的XML解析器中有一个特殊的接口,它需要从互联网获取xml-path?
我想解析Qt中的一些XML文件,但该文件位于Web中的某个服务器上。当我使用QML时,我能够使用XMLHttpRequest
类,它接受互联网上的文件地址(我需要)。来自Internet和Qt的XML文件
我只有一个想法:使用网络请求并直接下载该XML。这个想法可能是qt中的XML解析器中有一个特殊的接口,它需要从互联网获取xml-path?
据我所知,你应该下载它。 QHttp提供了简单的方法将其下载到临时文件。
QTemporaryFile temp_file;
QHttp http("example.com");
http.get("/your.xml",&temp_file);
新版本(基于QNetworkAccessManager):
QNetworkAccessManager * manager = new QNetworkAccessManager(this);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(fileIsReady(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("http://example.com/your.xml")));
...
void fileIsReady(QNetworkReply * reply)
{
QTemporaryFile temp_file;
temp_file.write(reply->readAll());
}
我不知道任何方式直接从QXML下载文件,我想你应该使用QNetwork先下载自己的ressource并解析它后。
QtXML本身不做任何网络连接。它在QIODevices上运行,它是任何执行I/O(文件,网络套接字,...)的通用接口。您可以将XML下载到临时文件然后解析它,或者,如果您逐渐分析,例如使用QXmlStreamReader,直接分析数据,因为它到达:
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
QNetworkReply* reply = QNetworkAccessManager::get(manager->get(QNetworkRequest(QUrl("http://www.foo.com/example.xml"))) ;
QXmlStreamReader reader(reply);
//...parse
注意,在解析QXmlStreamReader::PrematureEndOfDocumentError S可occurr,如果没有足够的数据下载。 您可以连接到应答的readyRead()信号以继续,或者如果您在UI线程之外解析,则可以使用reply-> waitForReadyRead()。
“这个类已经过时了,它提供了保持旧的源代码工作,我们强烈建议不要在新代码中使用它。” (http://doc.qt.nokia.com/latest/qhttp.html#details) – anno 2011-06-06 16:29:44
我更新了代码。 – Naszta 2011-06-07 13:29:58