QT:QXmlStreamReader始终返回“文档过早结束”错误

时间:2017-09-21 14:21:35

标签: c++ xml qt qxmlstreamreader

我对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());
}
...

它始终报告错误“文档过早结束”。为什么?当看到debbuging时,所有元素都会被正确解析或跳过。

1 个答案:

答案 0 :(得分:3)

我验证了代码的行为。实际上,似乎readNextStartElement()没有正确检查文档的结尾。它只检查start / end元素以返回其值,因此如果读取文档末尾,则对readNext的内部调用会引发&#34;提前结束&#34;。

要快速修复,请尝试使用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;