2013-10-29 1 views
0

버전 번호를 검색하기 위해 QXmlQuery로 Mac 응용 프로그램의 "Info.plist"를 구문 분석하려고합니다. 여기의 Info.plist에 예입니다 :QXmlQuery.evaluateQuery stuck

<?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/키 [노드() = '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; 

그것은 잘 간다를, 다음에 나에게 빈 값을 제공하는 동안 stucks "query.evaluateTo", "까지 번역".

누군가 도움을 줄 수 있습니까?

답변

1

답장을 보내 주셔서 감사합니다. 그러나 많은 조사가 있은 후 여기에 문제가 있습니다.

내 코드에는 아무런 문제가 없습니다. 그것은 Qt5.1 브랜치의 버그입니다. QXmlQuery는 QCoreApplication이 작동해야하므로 코드가 정상적으로 작동합니다. 그러나 QApplication과 함께 사용하면 evaluateTo가 실패합니다.

코드를있는 그대로 사용하면 작동합니다. QCoreApplication에서 QApplication으로 변경하면 실패합니다.

Qt의 JIRA에 대한 버그 리포트를 작성했습니다.

+0

여전히 OS X에서 코드를 사용하여 답변을 만들지 못하고 단순히 QCoreApplication 대신 QApplication을 사용합니다. 이것은 Qt 5.1.1 바이너리 다운로드 (자체 컴파일되지 않음)입니다. –

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; 
    } 
} 
+0

내 컴퓨터 Qt 상용 4.8.4, VS2008, Win7에서 실패합니다. rc가 거짓이고 버전이 비어 있습니다. –

+0

@ValentinHeinitz 아마도 4.8.5로 수정 되었습니까? –