首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QXmlQuery.evaluateQuery卡住

QXmlQuery.evaluateQuery卡住
EN

Stack Overflow用户
提问于 2013-10-29 23:20:13
回答 2查看 578关注 0票数 0

为了检索版本号,我尝试用QXmlQuery解析Mac应用程序的“QXmlQuery”。下面是Info.plist上的一个示例:

代码语言:javascript
复制
<?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/keynode()='CFBundleShortVersionString'/following-sibling::string1/node()

它工作得很完美。

现在,当我将它转到Qt时,我使用以下代码:

代码语言:javascript
复制
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”中给出一个空值,它才会变得很好。

有人能帮忙吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-01 13:32:14

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

我的代码没有问题。这是Qt5.1分支的一个bug。QXmlQuery需要一个QCoreApplication才能工作,这就是为什么您的代码运行良好的原因。但是当与QApplication一起使用时,evaluateTo会失败。

如果我按原样尝试你的代码,它就能工作了。如果我从QCoreApplication改为QApplication,它就失败了。

我在Qt的JIRA上写了一个bug报告。

票数 1
EN

Stack Overflow用户

发布于 2013-10-30 00:05:51

我不能复制。以下内容在Qt 4.8.5和5.1.1操作系统X下都适用。

输出:

代码语言:javascript
复制
true "1.4
" 

显然,版本字符串在末尾包含一个换行符。谁知道为什么。

代码语言:javascript
复制
#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;
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19670967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档