Russian Qt Forum

Qt => XML => Тема начата: Flake от Март 05, 2008, 16:07



Название: Разьясните, почему так происходит при чтении.
Отправлено: Flake от Март 05, 2008, 16:07
Код:
QDomDocument docInstall;
docInstall = setContent("xml file");
QDomElement root = docInstall.documentElement();
QDomElement child = root.firstChildElement("component");
while (!child.isNull()) {
                QTreeWidgetItem * itemComponent = pSelectTypePage->wInstall->topLevelItem(i);
if (itemComponent->checkState(0) == Qt::Checked) // Это условие, если выбран компонент для установки в QTreeWidget
{
parseElement(child, installDir);
                        // Если сюда добавить что-то типа
                        otherEment.appendChild(child);
                        // То он читает первый элемент, а последующие пропадают. Из-за чего это происходит?
}

child = child.nextSiblingElement("component");
}

Вопрос в камментариях кода.


Название: Re: Разьясните, почему так происходит при чтении.
Отправлено: vaprele07 от Март 06, 2008, 03:33
сделай cloneNode


Название: Re: Разьясните, почему так происходит при чтении.
Отправлено: Flake от Март 06, 2008, 10:52
А что именно надо клонировать?

Пробовал весь документ как тут http://prog.org.ru/forum/index.php/topic,6399.0.html (http://prog.org.ru/forum/index.php/topic,6399.0.html)

Код:
QDomDocument source;
QDomDocument target = source.cloneNode(true);

Но ругается: cannot convert from 'QDomNode' to 'QDomDocument'.


Название: Re: Разьясните, почему так происходит при чтении.
Отправлено: GreenGo от Январь 29, 2009, 09:31
Код:
QDomDocument docInstall;
docInstall = setContent("xml file");
QDomElement root = docInstall.documentElement();
QDomElement child = root.firstChildElement("component");
while (!child.isNull()) {
                QTreeWidgetItem * itemComponent = pSelectTypePage->wInstall->topLevelItem(i);
if (itemComponent->checkState(0) == Qt::Checked) // Это условие, если выбран компонент для установки в QTreeWidget
{
parseElement(child, installDir);
                        // Если сюда добавить что-то типа
                        otherEment.appendChild(child);
                        // То он читает первый элемент, а последующие пропадают. Из-за чего это происходит?
}

child = child.nextSiblingElement("component");
}

Вопрос в камментариях кода.
В твоем коде обработается только  один child, так как он теперь последний "ребенок" у otherEment и child.nextSiblingElement("component") возвращает NULL.

Вот вариант:

Код:
QDomDocument docInstall;
docInstall = setContent("xml file");
QDomElement child = docInstall.firstChildElement("component"); // в твоем коде была лишняя переменная root
while (!child.isNull()) {
                QTreeWidgetItem * itemComponent = pSelectTypePage->wInstall->topLevelItem(i);
if (itemComponent->checkState(0) == Qt::Checked) // Это условие, если выбран компонент для установки в QTreeWidget
{
parseElement(child, installDir);
                                             //ф-ция должна быть обьявлена как parseElement(const QDomElement &, <вторая переменная>), во избежании изменения child
                                                otherEment.appendChild(child.cloneNode(true)); //Добавляем глубокую копию child к OtherEment. Если поставить false то детей не клонирует
                        }

child = child.nextSiblingElement("component");
}

должно работать