我正在尝试使用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”停留了一段时间才开始,然后在“版本”中给我一个空值。
有人可以帮忙吗?
答案 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的错误报告。