我是Qt的新手,我每天都在学习新东西 目前,我正在空闲时间为我的诺基亚N900开发一个小应用程序 一切都很好,我能够在设备上编译和运行Maemo应用程序。
我刚刚在Qt中了解了foreach
关键字。 (我知道它不是用C ++编写的,所以直到我不小心偶然发现了一个提到它的Qt文档时才考虑它。)
所以,我决定将我那令人讨厌且难以理解的循环改为foreach,但我对此失败了:
QDomNodeList list = doc.lastChild().childNodes().at(1).firstChild().childNodes();
for (int x = 0; x < list.count(); x++)
{
QDomElement node = list.at(x).toElement();
// Do something with node
}
这是我尝试的方式:
foreach (QDomElement node, doc.lastChild().childNodes().at(1).firstChild().childNodes())
{
// Do something with node
}
由于某种原因,上面的代码甚至没有编译。我从编译器得到了神秘的错误消息。
有人可以向我解释如何正确使用它吗?
如果foreach
循环不支持QDomNodeList
,是否有办法处理支持foreach
的XML文件?
修改
为了澄清,在这种情况下// Do something with node
如下:
EveCharacter chr;
chr.setName(node.attribute(EVE_NAME));
chr.setId(node.attribute(EVE_CHARACTER_ID).toInt());
acc->addCharacter(chr);
acc的类型为EveAccount
,其中数据存储在QList<EveCharacter>
。
大写符号是编译时常量字符串 (我正在为EVE Online API创建一个客户端。这来自接收the account characters XML并解释它的方法。)
这是我创建doc
:
QDomDocument doc;
doc.setContent(reply->readAll());
请注意,reply
是QNetworkReply*
,是从QNetworkAccessManager
发回的。
但是,由于EVE API与XML协同工作,我在应用程序的许多地方都做了很多与此类似的XML解析。
大多数XML可以长达数百行,并且可以包含非常规的数据模式such as this one。
答案 0 :(得分:8)
foreach
仅支持container classes,因此您无法将其与QDomNodeList
一起使用。
我不确定您的实际目标,但我发现QXmlSimpleReader
和QXmlStreamReader
是处理XML的最简单方法。
编辑以匹配问题编辑:
您尝试做的事情看起来像是XPath或XQuery的主要候选者。看一下QtXmlPatterns
模块,这将为您提供一组字符节点,而无需遍历所有其他节点。
答案 1 :(得分:2)
foreach
适用于Qt Generic Containers。它似乎不是QDomNodeList从任何内容继承的,因此您无法使用foreach
。
您是否可以遍历节点列表并将节点插入QList<QDomElement>
?