我有一个来自我的Minecraft服务器的XML结构化用户列表,我希望在我的QML应用程序中显示。如果Feed中只有一(1)个用户名,则可以使用,但如果有更多用户名,我将不会显示任何用户名。
XML结构(我们称之为xml.file):
<server>
<status>Online</status>
<connected-users>
<user>username1</user>
<user>username2</user>
</connected-users>
</server>
然后是QML代码(缩短):
import QtQuick.XmlListModel 2.0
XmlListModel {
id: msmData
source: "xml.file"
query: "/server"
XmlRole { name: "serverState"; query: "status/string()" }
XmlRole { name: "connectedUser"; query: "connected-users/user/string()" }
}
ListView {
id: userList
width: parent.width
height: units.gu(5)
model: msmData
delegate: ListItem.Standard {
text: connectedUser
onClicked: {
console.debug('Debug: User clicked "'+connectedUser+'"')
checkCurrentUser(connectedUser)
PopupUtils.open(userDialog, userList)
}
}
答案 0 :(得分:0)
如果您将connectedUser的查询更改为connected-users/user[1]/string()
,您会注意到您可以再次访问username1(另请注意,Xpath将索引设置为1而不是0)。 This bug(虽然最初报告为Qt 4.7)表明缺乏对访问嵌套列表的支持。
我尝试访问RSS提要中的文章的多个类别时遇到了同样的问题,并通过启动XMLHttpRequest
来解决它,通过JavaScript解析我的所有数据(包括嵌套列表,是否为博客文章的标签或在服务器上连接用户),然后附加到附加到ListView的QML ListModel
。可能有一种方法可以迭代XmlListModel中的嵌套列表 - 正如bug的评论所暗示的那样 - 但我还没有尝试过该评论中链接的方法。
以下是使用XMLHttpRequest的工作示例(改编自论文here)以及您在名为&#39; test.xml&#39;的文件中提供的XML:
import QtQuick 2.0
import Ubuntu.Components 0.1
import Ubuntu.Components.ListItems 0.1 as ListItem
Rectangle {
width: 360
height: 360
ListModel {
id: msmData
}
Component.onCompleted: {
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if (request.readyState === XMLHttpRequest.DONE) {
var document = request.responseXML.documentElement;
var msmServer = {
status: '',
users: []
};
for(var i = 0; i < document.childNodes.length; i++) {
var record = document.childNodes[i];
if (record.tagName === 'status') {
msmServer.status = record.childNodes[0].nodeValue;
} else if (record.tagName === 'connected-users') {
for (var k = 0; k < record.childNodes.length; k++){
var elem = record.childNodes[k];
if(elem.tagName === 'user'){
msmServer.users.push({ name: elem.childNodes[0].nodeValue });
}
}
}
}
msmData.append(msmServer);
}
}
request.open('GET', 'test.xml');
request.send();
}
ListView {
id: userList
width: parent.width
height: units.gu(5)
model: msmData
delegate: ListItem.Subtitled {
text: status
subText: {
var userText = '';
for (var i = 0; i < users.count; i++) {
if (i > 0) userText += ', ';
userText += users.get(i).name;
}
return userText;
}
onClicked: {
console.debug('Debug: User clicked "'+status+'"')
for (var i = 0; i < users.count; i++) {
console.debug(users.get(i).name);
}
}
}
}
}