Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';这个XML和QML代码有什么问题?多个项目显示无_Xml_Qt_Listview_Qml - Fatal编程技术网

什么';这个XML和QML代码有什么问题?多个项目显示无

什么';这个XML和QML代码有什么问题?多个项目显示无,xml,qt,listview,qml,Xml,Qt,Listview,Qml,我有一个来自Minecraft服务器的XML结构化用户列表,我想在QML应用程序中显示它。如果提要中只有一(1)个用户名,它就可以工作,但是如果有更多的用户名,我就不会显示任何用户名 XML结构(我们称之为XML.file): 如果将connectedUser的查询更改为connected users/user[1]/string(),您会注意到可以再次访问username1(还要注意,Xpath从1而不是0开始索引)。(虽然最初报告用于Qt4.7)表明,访问嵌套列表的支持相当缺乏 我在尝试访问

我有一个来自Minecraft服务器的XML结构化用户列表,我想在QML应用程序中显示它。如果提要中只有一(1)个用户名,它就可以工作,但是如果有更多的用户名,我就不会显示任何用户名

XML结构(我们称之为XML.file):


如果将connectedUser的查询更改为
connected users/user[1]/string()
,您会注意到可以再次访问username1(还要注意,Xpath从1而不是0开始索引)。(虽然最初报告用于Qt4.7)表明,访问嵌套列表的支持相当缺乏

我在尝试访问RSS提要中文章的多个类别时遇到了同样的问题,并通过启动
XMLHttpRequest
,通过JavaScript解析我的所有数据(包括嵌套列表,无论是博客帖子的标记还是服务器上连接的用户),解决了这个问题,然后附加到附加到ListView的QML
ListModel
。可能有一种方法可以迭代XmlListModel中的嵌套列表——正如bug的一条注释所示——但我还没有尝试该注释中链接的方法

下面是一个使用XMLHttpRequest和您在名为“test.XML”的文件中提供的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);
                }
            }
        }
    }
}
导入QtQuick 2.0
导入Ubuntu.Components 0.1
将Ubuntu.Components.ListItems 0.1导入为ListItem
长方形{
宽度:360
身高:360
列表模型{
id:msmData
}
Component.onCompleted:{
var request=new XMLHttpRequest();
request.onreadystatechange=函数(){
if(request.readyState==XMLHttpRequest.DONE){
var document=request.responseXML.documentElement;
变量msmServer={
状态:“”,
用户:[]
};
对于(var i=0;i0)userText+=',';
userText+=users.get(i).name;
}
返回用户文本;
}
再次点击:{
console.debug('调试:用户单击“+”状态+”)
对于(var i=0;i
username2Man,这很复杂。我会试试那个链接。真让人恼火。我的意思是,RSS提要是有效的,所以wy不是我的XML?我尝试了你共享的链接,但它不想起作用。“必须有一种方法来实现这一点。”DanielHolm我添加了一个利用XMLHttpRequest和QML有限的DOM API的示例。希望它能起作用。samvtran,这在单击状态时确实有帮助,但我不知道如何在listitem中显示用户名?@DanielHolm我更新了代码示例,将listitem更改为“Subtitled”,并给出了一个迭代用户名的示例,以提供一个简单的用户名列表作为子文本。
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)
                        }
                    }
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);
                }
            }
        }
    }
}