×
Namespaces

Variants
Actions

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

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

代码示例
兼容于
平台:
Symbian

文章
hozhou 在 16 Mar 2011 创建
最后由 hamishwillee 在 13 Jun 2012 编辑


Contents

引言

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

相关链接

This page was last modified on 13 June 2012, at 13:59.
133 page views in the last 30 days.
×