为了检索版本号,我尝试用QXmlQuery解析Mac应用程序的“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/keynode()='CFBundleShortVersionString'/following-sibling::string1/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”中给出一个空值,它才会变得很好。
有人能帮忙吗?
发布于 2013-11-01 13:32:14
非常感谢你的答复。然而,经过大量的调查,事情是这样的。
我的代码没有问题。这是Qt5.1分支的一个bug。QXmlQuery需要一个QCoreApplication才能工作,这就是为什么您的代码运行良好的原因。但是当与QApplication一起使用时,evaluateTo会失败。
如果我按原样尝试你的代码,它就能工作了。如果我从QCoreApplication改为QApplication,它就失败了。
我在Qt的JIRA上写了一个bug报告。
发布于 2013-10-30 00:05:51
我不能复制。以下内容在Qt 4.8.5和5.1.1操作系统X下都适用。
输出:
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;
}
}https://stackoverflow.com/questions/19670967
复制相似问题