2012-04-26 101 views
0

继承人我想读XML的格式:Qt的读取XML文件QXmlStreamReader - 死循环

<base> 
    <pasta>name 
     <musica>my audio.mp3</musica> 
     <musica>my audio.mp3</musica> 
     <musica>my audio.mp3</musica> 
     <musica>my audio.mp3</musica> 
    </pasta> 
    <pasta>name2 
     <musica>my audio.mp3</musica> 
     <musica>my audio.mp3</musica> 
    </pasta> 
</base> 

我使用读取XML的代码:

QList<PastaBase>* BaseWrapper::carregarDeXml(QString caminhoArquivoXml) 
{ 
    //Carrega do XML 
    QFile arquivoXml(caminhoArquivoXml); 
    if(!arquivoXml.open(QIODevice::ReadOnly)) 
    { 
     QString s(QString::fromUtf8("Erro ao abrir arquivo de base")); 
     QMessageBox::warning(0, "Erro", s); 
     throw QString("Erro ao abrir arquivo de base"); 
    } 
    QList<PastaBase> *base = new QList<PastaBase>(); 
    QXmlStreamReader r; 
    r.setDevice(&arquivoXml); 
    while(!r.atEnd() && !r.hasError()) 
    { 
     r.readNext(); 

     if(r.isStartElement()) 
     { 
      if(r.name().toString() == QString("pasta")) 
      { 
       PastaBase p; 
       p.setNome(r.readElementText()); 
       r.readNextStartElement(); 
       while(r.name().toString() == QString("musica")) 
       { 
        std::cout << "elemento: " << r.name().toLatin1().constData() << " - valor: " << r.readElementText().toLatin1().constData() << std::endl; 
        p.getMidias()->append(r.readElementText()); 
        r.readNextStartElement(); 
       } 
       base->append(p); 
      } 
     } 
    } 
    arquivoXml.close(); 
    return base; 
} 

输出 - 卡在while循环中:

elemento: musica - valor: 
elemento: musica - valor: 
elemento: musica - valor: 
elemento: musica - valor: 
elemento: musica - valor: 
elemento: musica - valor: 
elemento: musica - valor: 
elemento: musica - valor: 
... 
... 
... 

回答

0

您确定这是您正在运行的代码吗?我试图复制/粘贴它,但它不编译...

r.name()返回一个QStringRef并且没有toLatin1()方法在其中。如果我用toString()方法替换它,那么它对我来说编译得很好。

但你的问题是不存在的,我觉得你在XML文件中做什么是非法的:

<pasta>you can't put something here 
    <musica>my audio.mp3</musica> 
    <musica>my audio.mp3</musica> 
    <musica>my audio.mp3</musica> 
    <musica>my audio.mp3</musica> 
</pasta> 

是导致无限循环的线是p.setNome(r.readElementText());因为你不能在这里键入文本如果你有它的子标签。

我不是很熟悉XML,但我真的认为你的问题在这里。任何人都可以确认吗?

+0

我不知道为什么,但QStringRef.toLatin1()正在编译和在这里工作。 – fredcrs 2012-04-26 18:36:06

+0

至于XML的孩子,我认为你可以把文本放在那里...我有另一个用Java编写的应用程序写这个XML ....我有另一个C++ Qt方法,保存xml在这种格式工作 – fredcrs 2012-04-26 18:36:50

+0

和是的,是这行导致错误 – fredcrs 2012-04-26 18:51:08