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.
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
@Skilldrick - ¡Gracias por la explicación! – Venemo