【问题标题】:QXmlQuery.evaluateQuery stuckQXmlQuery.evaluateQuery 卡住了
【发布时间】:2013-10-29 23:20:13
【问题描述】:

我正在尝试使用 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”之前一切正常,卡住了一段时间,然后在“version”中给了我一个空值。

有人可以帮忙吗?

【问题讨论】:

    标签: xml qt info.plist


    【解决方案1】:

    我无法复制。以下在 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;
        }
    }
    

    【讨论】:

    • 在我的电脑 Qt 商业版 4.8.4、VS2008、Win7 上失败。 rc 为假,版本为空
    • @ValentinHeinitz 也许它已在 4.8.5 中修复?
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我仍然无法使用我的答案中的代码在 OS X 上重现,并且只需使用 QApplication 而不是 QCoreApplication。这是 Qt 5.1.1 二进制下载(非自编译)。
    猜你喜欢
    • 2012-06-23
    • 2021-10-08
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多