0

这是我要阅读的 XML 格式:

<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:
...
...
...
4

1 回答 1

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 不是很熟悉,但我真的认为你的问题就在这里。有人可以确认吗?

于 2012-04-26T17:33:52.160 回答