2010-05-26 12 views
9

Ich bin neu in Qt und lerne jeden Tag etwas Neues.
Derzeit entwickle ich eine kleine Anwendung für mein Nokia N900 in meiner Freizeit.
Alles ist in Ordnung, ich kann Maemo-Anwendungen auf dem Gerät kompilieren und ausführen.Wie verwende ich foreach mit QDomNodeList in Qt?

habe ich nur über die foreach Schlüsselwort in Qt gelernt. (Ich weiß, dass es nicht in C++ ist, also habe ich nicht darüber nachgedacht, bis ich versehentlich auf ein Qt-Dokument stieß, das das erwähnte.)
Also beschloss ich, meine ziemlich nervigen und unlesbaren Loops zu foreach zu ändern, aber ich scheiterte mit diesem:

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 
} 

Dies ist, wie ich versucht:

foreach (QDomElement node, doc.lastChild().childNodes().at(1).firstChild().childNodes()) 
{ 
    // Do something with node 
} 

Aus irgendeinem Grund der obige Code nicht einmal kompilieren lässt. Ich bekomme kryptische Fehlermeldungen vom Compiler.

Könnte jemand mir bitte erklären, wie man es richtig machen?

Wenn die foreach Schleife QDomNodeList nicht unterstützt, gibt es eine Möglichkeit, XML-Dateien zu behandeln, die foreach unterstützt?

EDIT:

Um zu klären, // Do something with node ist folgend in diesem Fall:

EveCharacter chr; 
chr.setName(node.attribute(EVE_NAME)); 
chr.setId(node.attribute(EVE_CHARACTER_ID).toInt()); 
acc->addCharacter(chr); 

Wo acc vom Typ EveAccount, die Daten in einem QList<EveCharacter> speichert.

Die Groß Symbole sind Kompilierung-Konstante Strings.
(Ich bin ein Client für das EVE Online API erstellen Dieses von der Methode ist, dass the account characters XML und interpretiert sie empfängt..)

Dies ist, wie ich schaffen doc:

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

Beachten Sie, dass reply ist a QNetworkReply*, die von einem QNetworkAccessManager zurückgeschickt wird.

Da jedoch die EVE API mit XML arbeitet, kann ich eine Menge XML in vielen Orten in meiner Anwendung dieser sehr ähnlich Parsen.
Die meisten der XMLs können mehrere hundert Zeilen lang sein und ganz unregelmäßiges Datenmuster enthalten, such as this one.

+1

Nebenbei ist der Grund, warum Sie eine kryptische Nachricht erhalten, weil 'foreach' kein Keyword ist, es ist ein Makro. Da C++ die Syntax nicht unterstützt, muss Qt einige clevere Pre-Prozessor-Sachen machen, damit es funktioniert. Das bedeutet, dass Compilermeldungen für Code verwendet werden, der nicht so aussieht wie der Code, den Sie sehen. – Skilldrick

+0

@Skilldrick - Danke für die Erklärung! – Venemo

Antwort

7

foreach unterstützt nur die container classes, so dass Sie es nicht mit einer QDomNodeList verwenden können.

Ich bin mir nicht sicher von Ihnen tatsächlichen Ziel, aber ich finde die QXmlSimpleReader und QXmlStreamReader, um die einfachste Möglichkeit, mit XML umzugehen.

bearbeiten Frage bearbeiten entsprechen:

Was Sie versuchen, für XPath oder XQuery sieht aus wie ein Hauptkandidat zu tun. Werfen Sie einen Blick auf das QtXmlPatterns Modul, das Ihnen eine Reihe von Zeichenknoten bietet, ohne dass Sie alle anderen Knoten durchlaufen müssen.

+0

@Adam - Ich habe die Dokumente gelesen, die Sie verknüpft haben, aber ich habe nicht verstanden, wie Sie sie richtig verwenden. Ich sehe keine Methoden, um in der DOM-Struktur zu navigieren. Könnten Sie mir bitte das Äquivalent zu meinem Code mit 'QXmlSimpleReader' und' QXmlStreamReader' zur Verfügung stellen? – Venemo

+0

Sicher, wenn Sie '// Tun Sie etwas mit Knoten ' –

+0

Ich werde klarer sein. Wenn Sie nur XML-Dateien lesen oder schreiben, funktionieren diese großartig. Wenn Sie versuchen, XML als Datenbank zu verwenden und nicht XQuery oder XPath verwenden möchten (nicht sicher, warum Sie dies tun möchten), benötigen Sie 'QDomDocument'. –

2

foreach arbeitet mit Qt Generic Containers. Es sieht nicht aus wie QDomNodeList erbt von irgendetwas, so dass Sie nicht foreach verwenden können.

Können Sie die Knotenliste durchlaufen und die Knoten in eine QList<QDomElement> einfügen?

+0

Haben Sie einen Link zu den 4.2 Dokumenten für Container, aber die 4.6 Dokumente für die Klasse? :) –

+0

könnte ich, aber ich sehe nicht den Punkt in zwei Schleifen statt einer ... – Venemo

+0

@Adam - Ich änderte es bald nachdem ich gepostet - Es ist nur, was Google bringt! Ich finde, welche Dokumente mit dem ersten Ergebnis auf Google sind ziemlich willkürlich ... – Skilldrick