2010-05-26 283 views
9

我是Qt新手,每天都在学习新东西。
目前,我在空闲时间为我的诺基亚N900开发小型应用程序。
一切都很好,我可以在设备上编译和运行Maemo应用程序。如何在Qt中使用QDomNodeList的foreach?

我刚刚了解到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,有没有办法处理XML文件,它支持foreach

编辑:

为了澄清,// 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>存储数据的。

大写符号是编译时常量字符串。
(我创建了在线前夕API客户端这是从接收the account characters XML并对其进行解释的方法。)

这是我如何创建doc

QDomDocument doc; 
doc.setContent(reply->readAll()); 

注意reply是一个QNetworkReply*这是从QNetworkAccessManager送回。

但是,由于EVE API与XML协同工作,我在我的应用程序的许多地方做了很多与此类似的XML解析。
大部分XML可能有几百行,可能包含相当不规则的数据模式,such as this one

+1

另外,你得到一个神秘的信息的原因是因为'foreach'实际上并不是关键字,而是一个宏。由于C++不支持该语法,因此Qt必须做一些聪明的预处理器才能使其工作。这意味着任何编译器消息都将用于看起来不像代码那样的代码。 – Skilldrick 2010-05-26 16:28:01

+0

@Skilldrick - 感谢您的解释! – Venemo 2010-05-26 16:31:23

回答

7

foreach只支持container classes,所以你不能用它与QDomNodeList

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

编辑匹配问题编辑:

什么你正在尝试做的看起来像一个总理候选人的XPath或XQuery。看看QtXmlPatterns模块,这将为您提供一组字符节点,而无需遍历所有其他节点。

+0

@亚当 - 我读了你链接的文档,但我没有理解如何正确使用它们。我没有看到它们在DOM树中导航的方法。 您能否使用'QXmlSimpleReader'和'QXmlStreamReader'为我提供相当于我的代码? – Venemo 2010-05-26 16:27:34

+0

当然,如果你提供'//做点什么节点' – 2010-05-26 19:06:56

+0

我会更清楚。如果您只是阅读或编写XML文件,这些工作很好。如果您尝试使用XML作为数据库并且不想使用XQuery或XPath(不知道为什么要这样做),那么您需要'QDomDocument'。 – 2010-05-26 19:14:03

2

foreachQt Generic Containers一起使用。它看起来不像QDomNodeList继承任何东西,所以你不能使用foreach

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

+0

你链接到容器的4.2文档的任何原因,但是该类的4.6文档的任何原因? :) – 2010-05-26 16:07:45

+0

我可以,但我没有看到有两个循环,而不是一个... – Venemo 2010-05-26 16:17:00

+0

@Adam - 我发布后不久就改变了它 - 这正是Google带来的!我发现你在Google上获得第一个结果的文档是非常随意的... – Skilldrick 2010-05-26 16:21:22