2010-05-26 11 views
9

Soy nuevo en Qt y estoy aprendiendo algo nuevo todos los días.
Actualmente, estoy desarrollando una pequeña aplicación para mi Nokia N900 en mi tiempo libre.
Todo está bien, puedo compilar y ejecutar aplicaciones Maemo en el dispositivo.¿Cómo uso foreach con QDomNodeList en Qt?

Acabo de enterarme de la palabra clave foreach en Qt. (Sé que no está en C++, así que no lo pensé hasta que tropecé accidentalmente con un Qt doc que lo mencionaba).
Así que decidí cambiar mis loops bastante molestos e ilegibles para foreach, pero fallé con esto:

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 
} 

Así es como he intentado:

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

Por alguna razón el código anterior ni siquiera se compila. Recibo mensajes de error crípticos del compilador.

¿Podría alguien explicarme cómo hacerlo bien?

Si el lazo foreach no es compatible con QDomNodeList, ¿hay alguna manera de manejar archivos XML que admita foreach?

EDIT:

Para aclarar, // Do something with node es la siguiente en este caso:

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

Dónde acc es de tipo EveAccount, que almacena datos en un QList<EveCharacter>.

Los símbolos en mayúsculas son cadenas constantes en tiempo de compilación.
(Estoy creando un cliente de la API de EVE Online Se trata del método que recibe the account characters XML y lo interpreta..)

esto es cómo creo doc:

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

Tenga en cuenta que es reply un QNetworkReply* que se envía desde un QNetworkAccessManager.

Sin embargo, como la EVE API funciona con XML, hago muchos análisis XML muy similares a esto en muchos lugares de mi aplicación.
La mayoría de los XML pueden tener varios cientos de líneas de longitud y pueden contener patrones de datos bastante irregulares, such as this one.

+1

Como un aparte, la razón por la que obtienes un mensaje críptico es porque 'foreach' no es en realidad una palabra clave, es una macro. Como C++ no es compatible con la sintaxis, Qt tiene que hacer algunas cosas inteligentes del pre-procesador para que funcione. Eso significa que cualquier mensaje de compilación será para código que no se parece mucho al código como lo está viendo. – Skilldrick

+0

@Skilldrick - ¡Gracias por la explicación! – Venemo

Respuesta

7

foreach solo es compatible con container classes, por lo que no puede usarlo con QDomNodeList.

No estoy seguro de su objetivo real, pero creo que el QXmlSimpleReader y el QXmlStreamReader son la forma más fácil de tratar con XML.

Editar para que coincida con la pregunta de edición:

Lo que estamos tratando de hacer se ve como un candidato ideal para XPath o XQuery. Eche un vistazo al módulo QtXmlPatterns, esto le dará un conjunto de nodos de caracteres sin tener que recorrer todos los otros nodos.

+0

@Adam - Leí los documentos que vinculó, pero no pude entender cómo usarlos correctamente. No veo ningún método para navegar en el árbol DOM. ¿Podría proporcionarme el equivalente de mi código usando 'QXmlSimpleReader' y' QXmlStreamReader'? – Venemo

+0

Claro si proporciona '// Haga algo con el nodo' –

+0

Voy a ser más claro. Si solo está leyendo o escribiendo archivos XML, funcionan muy bien. Si está tratando de usar XML como una base de datos y no quiere usar XQuery o XPath (no estoy seguro de por qué querría hacer eso), necesitaría 'QDomDocument'. –

2

foreach funciona con Qt Generic Containers. No se ve como QDomNodeList hereda de nada, por lo que no puede usar foreach.

¿Podría iterar a través de la lista de nodos e insertar los nodos en un QList<QDomElement>?

+0

¿Alguna razón por la que se vincula a los documentos 4.2 para contenedores pero los 4.6 documentos para la clase? :) –

+0

Podría, pero no veo el sentido de tener dos bucles en lugar de uno ... – Venemo

+0

@Adam - Lo cambié pronto después de publicarlo - ¡Es solo lo que Google menciona! Creo que los documentos con los que se obtiene con el primer resultado en Google son bastante arbitrarios ... – Skilldrick