2011-08-16 3 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がファイルから読み込むことから、ファイルをバッファに読み込み、そのint文字列をsetqueryに渡して変換しました。それが問題を解決しました。

今後同様の問題に直面する可能性のある人のためのサンプルコードです。

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; 

//.. 
//.. 

} 

おかげ ラケッシュ

関連する問題