2012-04-26 119 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