2013-10-29 57 views
0

我试图用QXmlQuery解析Mac应用程序的“Info.plist”以检索版本号。 这里有Info.plist中的例子:QXmlQuery.evaluateQuery卡住

<?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”,其中有一段stucks,然后给我一个空值“版”。

有人可以帮忙吗?

回答

1

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

我的代码没有问题。这是来自Qt5.1分支的一个bug。 QXmlQuery需要QCoreApplication才能工作,这就是为什么你的代码工作正常。但是当与QApplication一起使用时,evaluateTo失败。

如果我按原样尝试你的代码,它就可以工作。如果我从QCoreApplication更改为QApplication,则会失败。

我写了一篇关于Qt的JIRA的bug报告。

+0

我仍然无法在OS X上重现代码,只需使用'QApplication'而不是'QCoreApplication'。这是与Qt 5.1.1二进制下载(不是自编译的)。 –

2

我无法复制。下面的作品下既获Qt 4.8.5和5.1.1 OS 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; 
    } 
} 
+0

在我的电脑Qt商业4.8.4,VS2008,Win7上失败。 rc是假的,版本是空的 –

+0

@ValentinHeinitz也许它在4.8.5中被修复了? –