0

我正在尝试使用 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/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 回答