0

QML アプリケーションで表示したい Minecraft サーバーからの XML 構造化ユーザーリストがあります。フィードにユーザー名が 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)
                        }
                    }
4

1 に答える 1

0

connectedUser のクエリを に変更するとconnected-users/user[1]/string()、username1 に再びアクセスできることがわかります (Xpath は 0 ではなく 1 からインデックスを開始することにも注意してください)。このバグ(最初は Qt 4.7 で報告されましたが) は、ネストされたリストへのアクセスのサポートがかなり不足していることを示唆しています。

RSS フィードの記事の複数のカテゴリにアクセスしようとして同じ問題に遭遇し、XMLHttpRequestJavaScript を使用してすべてのデータを解析し (ブログ投稿のタグまたはサーバー上の接続ユーザーのタグであるかどうかにかかわらず、ネストされたリストを含む) を開始することで回避しました。 ListModelListView に添付された QML に追加します。バグのコメントの 1 つが示唆しているように、XmlListModel 内のネストされたリストを反復処理する方法があるかもしれませんが、そのコメントにリンクされている方法は試していません。

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);
                }
            }
        }
    }
}
于 2013-06-01T15:14:04.240 に答える