【问题标题】:XML file from internet and Qt来自 Internet 和 Qt 的 XML 文件
【发布时间】:2011-07-27 17:36:50
【问题描述】:

我想在 Qt 中解析一些 XML 文件,但该文件位于 web 中的某个服务器上。当我使用 QML 时,我可以使用 XMLHttpRequest 类,它获取 Internet 中文件的地址(我确实需要)。

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

【问题讨论】:

    标签: c++ xml qt parsing


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

    我不知道有什么方法可以直接从 QXML 下载文件,我认为你应该先使用 QNetwork 下载你的资源,然后再解析它。

    【讨论】:

      【解决方案3】:

      QtXML 本身不做任何联网。它在 QIODevices 上运行,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::PrematureEndOfDocumentErrors 可能会在解析时出现,如果尚未下载足够的数据。 您可以连接到回复的 readyRead() 信号以继续,或者如果您在 UI 线程之外进行解析,则使用回复->waitForReadyRead()。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-07
        • 1970-01-01
        • 2021-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-06
        相关资源
        最近更新 更多