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

+0

XML子として私はあなたがそこにテキストを置くことができると思います...私はこのXMLを書くJavaで書かれた別のアプリケーションを持って....そして私はこの形式でXMLを保存する別のC++ Qtメソッドを持っています – fredcrs

+0

とはい、エラーを引き起こしているこの行です – fredcrs

関連する問題