QT: QXmlStreamReader 总是 returns "Premature End of Document" 错误
QT: QXmlStreamReader always returns "Premature End of Document" error
我对 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());
}
...
而且总是报错"Premature end of document"。为什么?调试时,似乎所有元素都被正确解析或跳过。
我验证了您的代码的行为。实际上,readNextStartElement() 似乎没有正确检查文档结尾。它只检查 start/end 元素到 return 它的值,所以如果阅读超过文档末尾,它对 readNext 的内部调用会引发 "premature end".
要快速修复,请尝试使用 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;
我对 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());
}
...
而且总是报错"Premature end of document"。为什么?调试时,似乎所有元素都被正确解析或跳过。
我验证了您的代码的行为。实际上,readNextStartElement() 似乎没有正确检查文档结尾。它只检查 start/end 元素到 return 它的值,所以如果阅读超过文档末尾,它对 readNext 的内部调用会引发 "premature end".
要快速修复,请尝试使用 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;