Как оптимизировать код и вызывать рекурсивно?
Всем доброго времени суток.
У меня есть задача просмотреть все теги в xml-файле и остановиться на нужном, как только он будет найден, т.е. вернуть объект QDomElement, чтобы дальше с ним работать. Я данную задачу решаю в лоб (тут пока простой вывод названия тегов). Т.е., так как я знаю какова вложенность тегов, то я просто выполняю следующий код:
QDomElement docElem = doc.documentElement(); QDomNode n1 = docElem.firstChild(); while(!n1.isNull()){ QDomElement e1 = n1.toElement(); // try to convert the node to an element. if(!e1.isNull()){ qDebug() << qPrintable(e1.tagName()); // the node really is an element. if(e1.hasChildNodes()) { QDomNode n2 = e1.firstChild(); while(!n2.isNull()){ QDomElement e2 = n2.toElement(); if(!e2.isNull()){ qDebug() << qPrintable(" " + e2.tagName()); if(e2.hasChildNodes()){ QDomNode n3 = e2.firstChild(); while (!n3.isNull()) { QDomElement e3 = n3.toElement(); qDebug() << qPrintable(" " + e3.tagName()); if(e3.hasChildNodes()){ QDomNode n4 = e3.firstChild(); while (!n4.isNull()){ QDomElement e4 = n4.toElement(); qDebug() << qPrintable(" " + e4.tagName()); if(e4.hasChildNodes()){ QDomNode n5 = e4.firstChild(); while (!n5.isNull()) { QDomElement e5 = n5.toElement(); qDebug() << qPrintable(" " + e5.tagName()); if(e5.hasChildNodes()){ QDomNode n6 = e5.firstChild(); while (!n6.isNull()) { QDomElement e6 = n6.toElement(); qDebug() << qPrintable(" " + e6.tagName()); n6 = n6.nextSibling(); } } n5 = n5.nextSibling(); } } n4 = n4.nextSibling(); } } n3 = n3.nextSibling(); } } } n2 = n2.nextSibling(); } } } n1 = n1.nextSibling(); }
Вроде бы ничего сложного нет, но это уж слишком грамоздко. Хотелось бы использовать рекурсию. Но логически я понимаю что нужно делать, но как это реализуется на практике для меня темный лес. Перечитал много примеров и с числами Фибоначи, и с решением факториала. Но переложить на свой пример что-то не получается. Нужно ли вводить глобальные переменные, необходимые для посчета итераций? И тому подобное?
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.Do you like it? Share on social networks!
- Akiv Doros
- Nov. 11, 2024, 7:58 p.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:50points,
- Rating points-4
- molni99
- Oct. 26, 2024, 6:37 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:80points,
- Rating points4
- molni99
- Oct. 26, 2024, 6:29 a.m.
C ++ - Test 004. Pointers, Arrays and Loops
- Result:20points,
- Rating points-10
Вот пример, как это сделано у меня.
В основном теле делается вызов функции readReport , а потом он же делается внутри функции рекурсивно, до конца дерева документа. Безо всяких глобальных переменных.
Основное тело
readReport
Добрый день.
Не уверен в полной правильности того, что я написал, но ваш код по идее должен быть переписан следующим образом
В общем я написал вот такую функцию, которая возвращает список искомых элементов QDomElement
Спасибо всем, кто откликнулся.