2011-08-16 4 views
0

QXmlQuery 및 QT-XSLT를 사용하여 Itunes Libray 파일을 구문 분석하는 클래스를 작성하고 있습니다. 데이터를 포함하지 않습니다 여기QXmlQuery 및 XSLT20 : 결과 출력 문자열이 매 시간마다 비어 있으며 셸 (xmlpattern)에서 제대로 작동합니다.

ItunesLibParser::ItunesLibParser() 
{ 
    pathToLib = QString("/Users/rakesh/temp/itunes_xslt/itunes_music_library.xml"); 
} 

void ItunesLibParser::createXSLFile(QFile &inFile) 
{ 
    if (inFile.exists()) { 
     inFile.remove(); 
    } 

    inFile.open(QIODevice::WriteOnly); 
    QTextStream out(&inFile); 

    out << QString("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>"); 
    out << QString("<xsl:stylesheet version=\"2.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">"); 
    out << QString("<xsl:output method=\"text\" />"); 


    out << QString("<xsl:template name=\"playlistNames\">"); 
    out << QString("<xsl:value-of select=\"child::integer[preceding-sibling::key[1]='Playlist ID']\"/>"); 
    out << QString("<xsl:text>&#xa;</xsl:text>"); 
    out << QString("<xsl:value-of select=\"child::string[preceding-sibling::key[1]='Name']\"/>"); 
    out << QString("<xsl:text>&#xa;</xsl:text>"); 
    out << QString("</xsl:template>"); 


    out << QString("<xsl:template match=\"/\">"); 
    out << QString("<xsl:for-each select=\"plist/dict/array/dict\">"); 
    out << QString("<xsl:call-template name=\"playlistNames\"/>"); 
    out << QString("</xsl:for-each>"); 
    out << QString("</xsl:template>"); 

    out << QString("</xsl:stylesheet>"); 

    inFile.close(); 

    return; 

} 

void ItunesLibParser::dumpPlayList() 
{ 

    QXmlQuery query(QXmlQuery::XSLT20); 
    query.setFocus(QUrl(pathToLib)); 

    QFile xslFile("plist.xsl"); 
    createXSLFile(xslFile); 

    query.setQuery(QUrl("plist.xsl")); 

    QStringList* outDump = new QStringList(); 

    query.evaluateTo(outDump); 


    if(outDump != NULL) { 

     QStringList::iterator iter = (*outDump).begin(); 
     for (; iter != (*outDump).end(); 
       ++iter) 
      //code flow doesn't come here. It means being() == end() 
      std::cout << (*iter).toLocal8Bit().constData() << std::endl; 
    } 

    return; 
} 

OutDump :

여기 내 예제 코드입니다. Shell (xmlpatterns-4.7 mystlye.xsl itunes_music_library.xml)에서 쿼리를 실행하면 올바른 결과를 얻습니다.

프로그래밍 방식으로 호출하는 동안 문제가 있습니까? plist.xsl이 제대로 생성되었는지 확인했지만 의심 스럽지만 "/Users/rakesh/temp/itunes_xslt/itunes_music_library.xml"이로드되고 있는지 여부는 의심 스럽습니다. 아니면 또 다른 이유가있을 수 있습니다, 나는 혼란스러워합니다. 약간의 빛을 문제에 던질 전문가가 있습니까? 기쁠 것입니다.

답변

0

Intead에서 파일을 읽지 못했습니다. 파일을 버퍼로 읽어 들여 setquery에 전달 된대로 int 문자열을 변환했습니다. 그것은 그 문제를 해결했습니다.

다음은 앞으로 유사한 문제가 발생할 수있는 사람들을위한 샘플 코드입니다.

void ITunesMlibParser::parsePlayListItemXml(int plistId) 
{ 

    QXmlQuery xQuery(QXmlQuery::XSLT20); 
    QFile inFile("/Users/rakesh/temp/itunes_xslt/itunes_music_library.xml"); 

    if (!inFile.open(QIODevice::ReadOnly)) { 
     return; 
    } 

    QByteArray bArray; 
    while (!inFile.atEnd()) { 
     bArray += inFile.readLine(); 
    } 

    QBuffer xOriginalContent(&bArray); 
    xOriginalContent.open(QBuffer::ReadWrite); 
    xOriginalContent.reset(); 


    if (xQuery.setFocus(&xOriginalContent)) 
     std::cout << "File Loaded" << std::endl; 

//.. 
//.. 

} 

감사 케쉬