Qt的读取XML文件QXmlStreamReader - 死循环
问题描述:
继承人我想读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:
...
...
...
答
您确定这是您正在运行的代码吗?我试图复制/粘贴它,但它不编译...
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,但我真的认为你的问题在这里。任何人都可以确认吗?
我不知道为什么,但QStringRef.toLatin1()正在编译和在这里工作。 – fredcrs 2012-04-26 18:36:06
至于XML的孩子,我认为你可以把文本放在那里...我有另一个用Java编写的应用程序写这个XML ....我有另一个C++ Qt方法,保存xml在这种格式工作 – fredcrs 2012-04-26 18:36:50
和是的,是这行导致错误 – fredcrs 2012-04-26 18:51:08