Здравствуйте!
Все время, для дебажного просмотра содержимого элемента в XML-виде, я пользовался такой конструкцией.
// e - это QDomElement
QDomDocument t("t");
t.appendChild(e);
qDebug() << "Element " << t.toString();
Но вот третий день долбался с одной простой задачей, и никак не мог понять почему не работает... В конце концов нашел глюк, но почему он происходит - понять не могу.
Задачка: имеем документ с одноуровневыми элементами. В XML формате он записывается так
<element_1/>
<element_2/>
<element_3/>
Мне его нужно обежать и вывести имена всех элементов на экран.
Вот
нормально работающий код
// Конструируем документ
QDomDocument rectab;
QDomElement e1=rectab.createElement("element_1");
rectab.appendChild(e1);
QDomElement e2=rectab.createElement("element_2");
rectab.appendChild(e2);
QDomElement e3=rectab.createElement("element_3");
rectab.appendChild(e3);
// Проверяем что получилось
qDebug() << "Rectab " << rectab.toString();
// Обегаем все элементы
QDomNode n = rectab.firstChild();
while(!n.isNull())
{
QDomElement e = n.toElement(); // пробуем преобразовать узел в элемент.
if(!e.isNull())
{
qDebug() << "Element " << e.tagName(); // выводим имя узла
}
n = n.nextSibling();
}
Он реально пробегает по всем элементам, и выводит их названия
Rectab "<element_1/>
<element_2/>
<element_3/>
"
Element "element_1"
Element "element_2"
Element "element_3"
А вот
неправильно работающий цикл (стрелками показаны строчки которые были изменены относительно предыдущего примера кода)
// Обегаем все элементы
QDomNode n = rectab.firstChild();
while(!n.isNull())
{
QDomElement e = n.toElement(); // пробуем преобразовать узел в элемент.
if(!e.isNull())
{
-> QDomDocument t("t");
-> t.appendChild(e);
-> qDebug() << "Element " << t.toString(); // Выводим элемент на экран
}
n = n.nextSibling();
}
Который обегает только первый элемент
Rectab "<element_1/>
<element_2/>
<element_3/>
"
Element "<!DOCTYPE t>
<element_1/>"
То есть, элемент 2 и 3 не видится.
Почему так происходит? По какой причине узел
n теряет связи со своими последующими узлами в этом случае? Я
n при выводе вообще не трогаю, использую временный объект
t, в который вставляю временный объект
e (делаю это чтоб увидеть XML-код). Почему же данный цикл не работает?