2011-04-01 2 views
1

Je veux analyser un fichier XML dans Qt, mais ce fichier se trouve sur un serveur Web. Quand j'ai utilisé QML, j'ai pu utiliser la classe XMLHttpRequest qui prend l'adresse du fichier sur internet (ce dont j'ai besoin).Fichier XML à partir d'Internet et Qt

Je n'ai qu'une idée: utiliser la requête réseau et télécharger directement ce fichier xml. L'idée est peut-être qu'il y a une interface spéciale dans l'analyseur XML dans qt qui prend xml-path depuis internet?

Répondre

9

Comme je sais, vous devriez le télécharger. QHttp fournit un moyen facile de le télécharger dans un fichier temporaire.

QTemporaryFile temp_file; 
QHttp http("example.com"); 
http.get("/your.xml",&temp_file); 

Nouvelle version (basé sur 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

"Cette classe est obsolète, elle est fournie pour garder l'ancien code source en état de marche, nous vous déconseillons vivement de l'utiliser dans un nouveau code." (http://doc.qt.nokia.com/latest/qhttp.html#details) – anno

+1

J'ai mis à jour les codes. – Naszta

1

Je ne sais pas moyen de télécharger le fichier directement à partir QXML, je pense que vous devriez télécharger en utilisant QNetwork premier ressource et l'analyser après.

1

QtXML ne fait pas de mise en réseau elle-même. Il fonctionne sur QIODevices, qui est une interface générique pour tout ce qui fait des E/S (fichiers, sockets réseau, ...). Vous pouvez soit télécharger le fichier XML vers le fichier temporaire, puis l'analyser, ou, si vous effectuez une analyse incrémentielle, par exemple. en utilisant QXmlStreamReader, analyser les données directement à son arrivée:

QNetworkAccessManager *manager = new QNetworkAccessManager(this); 
QNetworkReply* reply = QNetworkAccessManager::get(manager->get(QNetworkRequest(QUrl("http://www.foo.com/example.xml"))) ; 
QXmlStreamReader reader(reply); 
//...parse 

Notez que QXmlStreamReader::PrematureEndOfDocumentError s peuvent se déclarerait lors de l'analyse, s'il n'y a pas assez de données téléchargées encore. Vous pouvez soit vous connecter au signal readyRead() de la réponse pour continuer, soit utiliser reply-> waitForReadyRead() si vous effectuez l'analyse en dehors du thread d'interface utilisateur.

Questions connexes