2010-05-26 92 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