首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QXmlQuery和XSLT20:每次生成的输出字符串都是空的,在外壳(Xmlpattern)上运行良好

QXmlQuery和XSLT20:每次生成的输出字符串都是空的,在外壳(Xmlpattern)上运行良好
EN

Stack Overflow用户
提问于 2011-08-16 16:13:23
回答 1查看 935关注 0票数 0

我正在编写一个类来解析Itunes Libray文件使用QXmlQuery和QT-XSLT。

下面是我的示例代码:

代码语言:javascript
复制
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,但我怀疑这是否会加载?也许还有另一个原因,我很困惑。有没有专家能帮我解决这个问题,我会很高兴的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-20 22:14:57

除了读取文件之外,我将文件读入缓冲区,并将该int字符串转换为传递给setquery的字符串。这就解决了问题。

以下是为将来可能面临类似问题的人提供的示例代码。

代码语言:javascript
复制
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;

//.. 
//..

}

谢谢Rakesh

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7075309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档