2011-04-01 32 views
1

我想解析Qt中的一些XML文件,但该文件位于Web中的某个服务器上。当我使用QML时,我能够使用XMLHttpRequest类,它接受互联网上的文件地址(我需要)。来自Internet和Qt的XML文件

我只有一个想法:使用网络请求并直接下载该XML。这个想法可能是qt中的XML解析器中有一个特殊的接口,它需要从互联网获取xml-path?

回答

9

据我所知,你应该下载它。 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()); 
} 
+0

“这个类已经过时了,它提供了保持旧的源代码工作,我们强烈建议不要在新代码中使用它。” (http://doc.qt.nokia.com/latest/qhttp.html#details) – anno 2011-06-06 16:29:44

+1

我更新了代码。 – Naszta 2011-06-07 13:29:58

1

我不知道任何方式直接从QXML下载文件,我想你应该使用QNetwork先下载自己的ressource并解析它后。

1

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()。