Я плохо знаком с QT, и я изучаю что-то новое каждый день.
В настоящее время я разрабатываю небольшое приложение для своего Nokia N900 в мое свободное время.
Все прекрасно, я могу скомпилировать и запустить приложения Maemo на устройстве.
Я только что узнал о foreach
ключевое слово в QT (Я знаю это, не находится в C++, таким образом, я не думал об этом, пока я случайно не наткнулся на спокойный документ, который упомянул это.)
Так, я решил изменить свои довольно раздражающие и нечитабельные циклы на 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
, который хранит данные в a QList
.
Символы верхнего регистра являются постоянными строками времени компиляции.
(Я создаю клиент в течение КАНУНА API Онлайн. Это из метода, который получает символы XML учетной записи и интерпретирует его.)
Это - то, как я создаю doc
:
QDomDocument doc;
doc.setContent(reply->readAll());
Отметьте это reply
a QNetworkReply*
который передают обратно от a QNetworkAccessManager
.
Однако как КАНУН API работает с XML, я делаю большой парсинг XML очень похожего на это во многих местах в моем приложении.
Большинство XMLs может быть несколькими сотнями строк долго и может содержать довольно нерегулярные шаблоны данных, такие как этот.
foreach
поддерживает только контейнерные классы, поэтому вы не можете использовать его с QDomNodeList
.
Я не уверен в вашей цели, но я считаю QXmlSimpleReader
и QXmlStreamReader
самым простым способом работы с XML.
Редактировать для соответствия редактированию вопроса:
То, что вы пытаетесь сделать, похоже, является главным кандидатом для XPath или XQuery. Посмотрите на модуль QtXmlPatterns
Он даст вам набор символьных узлов без необходимости перебирать все остальные узлы.
foreach
работает с универсальными контейнерами Qt . Не похоже, что QDomNodeList наследуется от чего-либо, поэтому вы не можете использовать foreach
.
Не могли бы вы перебрать список узлов и вставить их в QList
?