0

バージョン番号を取得するために、Mac アプリケーションの「Info.plist」を QXmlQuery で解析しようとしています。Info.plist の例を次に示します。

<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>BuildMachineOSBuild</key>
<string>13A598</string>

    <key>CFBundleShortVersionString</key>
<string>1.4</string>

    <key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.4</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>

目的は、「CFBundleShortVersionString」キーを使用して「1.4」値を取得することです。そのために、次のクエリを使用します。

/plist/dict/key[node()='CFBundleShortVersionString']/following-sibling::string[1]/node()

それは完全に機能します。

これを Qt に転置するときは、次のコードを使用します。

QString version;
QString fileName = appPath + "/Contents/Info.plist";
QFile file(fileName);
if (file.open(QIODevice::ReadOnly)) {
    QXmlQuery query;
    query.bindVariable("file", &file);
    query.setQuery("declare variable $file external; doc($file)/plist/dict/key[node()='CFBundleShortVersionString']/following-sibling::string[1]/node()");
    query.evaluateTo(&version);
}
return version;

「query.evaluateTo」までは問題なく動作し、しばらくスタックすると、「バージョン」に空の値が返されます。

誰か助けてくれませんか?

4

2 に答える 2

2

再現できません。以下は、OS X の Qt 4.8.5 と 5.1.1 の両方で動作します。

出力:

true "1.4
" 

どうやら、バージョン文字列の最後に改行が含まれているようです。理由は誰にもわかりません。

#include <QXmlQuery>
#include <QBuffer>
#include <QTextStream>
#include <QCoreApplication>
#include <QDebug>

const char xmlData[]=
        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
        "<plist version=\"1.0\"><dict>"
        "<key>BuildMachineOSBuild</key><string>13A598</string>"
        "<key>CFBundleShortVersionString</key><string>1.4</string>"
        "<key>CFBundleSignature</key><string>????</string>"
        "<key>CFBundleVersion</key><string>1.4</string>"
        "<key>NSPrincipalClass</key><string>NSApplication</string>"
        "</dict></plist>";

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTextStream out(stdout);
    QByteArray data(QByteArray::fromRawData(xmlData, sizeof(xmlData)-1));
    QBuffer buffer(&data);
    if (buffer.open(QIODevice::ReadOnly)) {
        QString version;
        QXmlQuery query;
        query.bindVariable("file", &buffer);
        query.setQuery("declare variable $file external; doc($file)/plist/dict/key[node()='CFBundleShortVersionString']/following-sibling::string[1]/node()");
        bool rc = query.evaluateTo(&version);
        qDebug() << rc << version;
    }
}
于 2013-10-30T00:05:51.000 に答える
1

お返事ありがとうございます。しかし、多くの調査の後、ここにあります。

私のコードは問題ありません。これは Qt5.1 ブランチのバグです。QXmlQuery が機能するには QCoreApplication が必要です。これが、コードが正常に機能する理由です。しかし、QApplication で使用すると、evaluateTo は失敗します。

あなたのコードをそのまま試してみると、うまくいきます。QCoreApplication から QApplication に変更すると失敗します。

Qt の JIRA に関するバグ レポートを書きました。

于 2013-11-01T13:32:14.173 に答える