QT:QXmlStreamReader总是返回“提前结束文档”错误

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,看来,所有元素都被正确解析或跳过。

+0

我怀疑的问题是,你永远不会检查你已经到达了文件的末尾。尝试在读取下一个元素之前调用[atEnd()](http://doc.qt.io/qt-5/qxmlstreamreader.html#atEnd)。 – MrEricSir

+0

谢谢你的评论。但我认为,这不是解决方案。如果我在while循环条件中使用atEnd(),结果是一样的,不幸的是。 –

我验证了您的代码的行为。确实,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;