У меня странная проблема с Qt QXmlStreamReader. Я пытаюсь разобрать простой документ (примечание: он генерируется с использованием QXmlStreamWriter):
<?xml version="1.0" encoding="UTF-8"?>
<tex>
<used_by/>
<facade>
<tags>
<town_related></town_related>
<zone_related></zone_related>
<visual_related></visual_related>
<kind_related></kind_related>
<other>flamingo</other>
</tags>
<additional_textures>
<id>flamingo_top.psd</id>
</additional_textures>
</facade>
</tex>
Используя этот код:
QFile file(filename);
if (file.open(QFile::ReadOnly | QFile::Text))
{
QXmlStreamReader xmlReader(&file);
while (xmlReader.readNextStartElement())
{
/* same issue when uncommented:
if (xmlReader.name() == "tex")
t->readXml(xmlReader);//parse texture
else*/
xmlReader.skipCurrentElement();
}
if (xmlReader.hasError())
emit reportError(xmlReader.errorString());
}
...
И это всегда сообщает об ошибке «Преждевременное завершение документа». Зачем? При отладке, похоже, все элементы анализируются или пропускаются правильно.
Я проверил поведение вашего кода. Действительно, похоже, что readNextStartElement () неправильно проверяет конец документа. Он только проверяет, чтобы элемент start / end возвращал его значение, поэтому при чтении после конца документа его внутренний вызов readNext вызывает «преждевременное завершение».
Для быстрого исправления попробуйте проверить конец документа самостоятельно, используя readNext (), например:
while (!xml.atEnd()) {
if (xml.readNext() != QXmlStreamReader::EndDocument) {
if (xml.isStartElement())
std::cout << qPrintable(xml.name().toString()) << std::endl;
}
}
if (xml.hasError())
std::cout << (xml.errorString().toUtf8().constData()) << std::endl;
Других решений пока нет …