2017-09-21 6 views
2

Qt QXmlStreamReaderに奇妙な問題があります。このコードを使用してQT:QXmlStreamReaderは常に "早すぎるEnd of Document"エラーを返します

<?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> 

:簡単な文書を解析しようI'am(注意:これはQXmlStreamWriterを使用して生成される)

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()を使用すると、結果は同じですが、不幸です。 –

答えて

1

コードの動作を確認しました。実際、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; 
関連する問題