QT:QXmlStreamReader总是返回“提前结束文档”错误
问题描述:
我有Qt QXmlStreamReader奇怪的问题。我'尝试解析简单的文档(注意:它使用QXmlStreamWriter生成):QT:QXmlStreamReader总是返回“提前结束文档”错误
<?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());
}
...
,它总是报告错误“的文件过早结束”。为什么?当debbuging,看来,所有元素都被正确解析或跳过。
答
我验证了您的代码的行为。确实,readNextStartElement()似乎没有正确检查文档的结尾。它仅检查开始/结束元素以返回其值,因此如果读取文档的末尾,则其对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;
我怀疑的问题是,你永远不会检查你已经到达了文件的末尾。尝试在读取下一个元素之前调用[atEnd()](http://doc.qt.io/qt-5/qxmlstreamreader.html#atEnd)。 – MrEricSir
谢谢你的评论。但我认为,这不是解决方案。如果我在while循环条件中使用atEnd(),结果是一样的,不幸的是。 –