使用Qt的QXmlStreamReader读取Xml数据时:
readNext()应该放在while(!reader.atEnd())循环的开头还是结尾?我已经碰到了许多将它放在最开始的例子,但也有不少将它放在最后。
QXmlStreamReader reader;
while(!reader.atEnd())
{
// <- Put reader.readNext() here?
QXmlStreamAttributes currentAttributes = reader.attributes();
// Do something with the attributes
// ...
// <- Or put reader.readNext() here?
}
我的直觉说它应该在循环的开始(要...读取下一个xml标记,用新数据填充属性()等)但我不是100%确定(由于很多将readNext()放在循环结尾的例子。把它放在最后可能也会给我一个一个错误的错误(atEnd()在最后一个readNext()时变为真,留下最后一个令牌未经处理),对吗?
答案 0 :(得分:1)
您需要了解类的工作原理以及每个函数的作用。作为演示,让我们考虑以下简单示例:
QXmlStreamReader reader("<info name=\"Foo\"/>");
while (!reader.atEnd()) {
//reader.readNext();
auto currentToken = reader.tokenType();
qDebug() << currentToken;
reader.readNext();
}
如果我们运行它并在每次迭代时打印出当前令牌(XML)的值,我们将得到以下序列:
readNext()
来电就在开头),readNext()
电话结束)如您所见,如果readNext()
位于循环的开头,您可以处理更多元素,包括文档的开始和结束元素。因此,QXmlStreamReader::readNext()
在这种循环中的早期调用更好。