`
ydbc
  • 浏览: 718554 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

qml 请求网络数据

 
阅读更多

最近在做诺基亚一个项目 需要用qml请求网络数据 之前的方案是用c++获取 后来发现那是一种非常糟糕的方法,后来查看诺基亚论坛里面 提供了一种方法 如下

如何用QML获取XML标签的属性

引言

QML script 支持 XMLHttpRequest 对象,我们可以使用它从网络上异步地获取数据。Qt文档中对XMLHttpRequest 的介绍很少,其自带的 XMLHttpRequest 例子也只是介绍了其一部分用法,并没有介绍如何获取XML标签的属性。本文就为大家简要介绍一下这方面的知识。

主要代码分析

MouseArea {
            id: mouseArea
            anchors.fill: parent
            onClicked: {
                log.text = ""
                console.log("\n")

                var doc = new XMLHttpRequest();
                doc.onreadystatechange = function() {
                    if (doc.readyState == XMLHttpRequest.HEADERS_RECEIVED) {
                        //showRequestInfo("Headers -->");
                        //showRequestInfo(doc.getAllResponseHeaders ());
                        //showRequestInfo("Last modified -->");
                        //showRequestInfo(doc.getResponseHeader ("Last-Modified"));
                    } else if (doc.readyState == XMLHttpRequest.DONE) {
                        var a = doc.responseXML.documentElement;
                        for (var ii = 0; ii < a.childNodes.length; ++ii) {
                            showRequestInfo("a.childNodes[" + ii + "].nodeName:" + a.childNodes[ii].nodeName);
                            var attr = a.childNodes[ii].attributes;
                            if(attr!=null) {
                                //following codes show how to get xml attributes
                                for (var j = 0; j < attr.length; ++j) {
                                    showRequestInfo('attr[' + j + '].name=' + attr[j].name + ', attr[' + j + '].value=' + attr[j].value);
                                }
                            }
                        }
                        //showRequestInfo("Headers -->");
                        //showRequestInfo(doc.getAllResponseHeaders ());
                        //showRequestInfo("Last modified -->");
                        //showRequestInfo(doc.getResponseHeader ("Last-Modified"));
                    }
                }

                doc.open("GET", "data.xml");
                //doc.open("GET", "http://api.flickr.com/services/feeds/photos_public.gne?format=rss2&tags=cat");
                //doc.open("GET", "http://rss.sina.com.cn/edu/focus19.xml");
                doc.send();
            }
        }


当区域被点击之后,我们首先创建了一个XMLHttpRequest,然后请求xml数据。当完全获取数据之后,我们首先取得responseXML的根节点。而后进行遍历。
a.childNodes[ii].attributes里并没有存放属性,具体属性的获取要通过 attr[j].value 。
参考:qdeclarativeglobalobject

还需要说明的一点是,为了使我们的qml程序能稳定地访问网络,那么们就需要为我们的qml程序设置一个NetworkAccessManager,这需要使用QDeclarativeEngine::setNetworkAccessManagerFactory()。当然我们也可以简单的使用系统默认设置:QNetworkProxyFactory::setUseSystemConfiguration(true); 详情见附件代码。



这里我们为了说明问题,采用了一个简单的静态本地xml文件——data.xml 。当然实际应用中我们通常会去网上动态地获取xml数据,见以上代码中注释掉的doc.open两行。
data.xml的内容如下:

<?xml version="1.0"?>
<note>
    <to id="recipients" address="name@company.com">Jones</to>
    <from>Jani</from>
</note>

程序输出分析

下面是程序的控制台输出:

a.childNodes[0].nodeName:#text
a.childNodes[1].nodeName:to
attr[0].name=id, attr[0].value=recipients
attr[1].name=address, attr[1].value=name@company.com
a.childNodes[2].nodeName:#text
a.childNodes[3].nodeName:from
a.childNodes[4].nodeName:#text

从以上输出明显可以看出XML文档的树形结构。 data.xml的根节点含有5个Node,其中Node1,和Node3分别对应data.xml中的 to 和 from标签。其中to 标签中含有两个属性,把它们都输出出来了。

这里补充说明一点:Node1又包含一个text的节点,其内容就是“Jones”。


下载例程

Media:QMLXmlHttpProperty.zip

Media:Simple微博客户端.zip

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics