2013-10-29 95 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中被修復了? –