如何在Qt中使用带有QDomNodeList的foreach?

时间:2010-05-26 15:57:25

标签: c++ qt qt4 foreach qt-maemo

我是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());

请注意,replyQNetworkReply*,是从QNetworkAccessManager发回的。

但是,由于EVE API与XML协同工作,我在应用程序的许多地方都做了很多与此类似的XML解析。
大多数XML可以长达数百行,并且可以包含非常规的数据模式such as this one

2 个答案:

答案 0 :(得分:8)

foreach仅支持container classes,因此您无法将其与QDomNodeList一起使用。

我不确定您的实际目标,但我发现QXmlSimpleReaderQXmlStreamReader是处理XML的最简单方法。

编辑以匹配问题编辑:

您尝试做的事情看起来像是XPath或XQuery的主要候选者。看一下QtXmlPatterns模块,这将为您提供一组字符节点,而无需遍历所有其他节点。

答案 1 :(得分:2)

foreach适用于Qt Generic Containers。它似乎不是QDomNodeList从任何内容继承的,因此您无法使用foreach

您是否可以遍历节点列表并将节点插入QList<QDomElement>