QXmlQuery.evaluateQuery卡住了

时间:2013-10-29 23:20:14

标签: xml qt info.plist

我正在尝试使用QXmlQuery解析Mac应用程序的“Info.plist”以检索版本号。 这是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中/字典/键[节点()= 'CFBundleShortVersionString'] /以下同胞::串[1] /节点()

效果很好。

现在,当我将其转换为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”停留了一段时间才开始,然后在“版本”中给我一个空值。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:1)

非常感谢您的回复。然而,经过大量的调查,这就是事情。

我的代码没问题。这是来自Qt5.1分支的错误。 QXmlQuery需要QCoreApplication才能工作,这就是为什么你的代码工作正常的原因。但是当与QApplication一起使用时,evaluateTo会失败。

如果我按原样尝试您的代码,它会起作用。如果我从QCoreApplication更改为QApplication,则会失败。

我写了一篇关于Qt的JIRA的错误报告。