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

来源:互联网 发布:activityresult数据库 编辑:程序博客网 时间:2024/05/06 04:21

如何用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:#texta.childNodes[1].nodeName:toattr[0].name=id, attr[0].value=recipientsattr[1].name=address, attr[1].value=name@company.coma.childNodes[2].nodeName:#texta.childNodes[3].nodeName:froma.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

相关链接

  • Qt 开发
  • Qt Quick (Chinese)