LINUX.ORG.RU

XML DOM + QT4


0

0

В общем, для определеных целей ставится задача : нужно загрузить XML из файла, провести его некоторую обработку и загрузить обратно. Под обработкой пока понимается "сортировка" - т.е. переупорядочивание некторых узлов. Я решил делать это через DOM. С загрузкой и сохранением проблем особо не возниклою Появились они при обработке. Такое ощущение, что нифига, из того, что делается, не сохраняется. Привожу короткий пример (это не из реальной программы - просто для проверки использовал) :

QDomNode value = XMLdata.documentElement().childNodes().item(1).cloneNode(true);

for (i = 2; i < XMLdata.documentElement().childNodes().length(); i++)

XMLdata.documentElement().childNodes().item(i) = value.cloneNode(true);

cout << "array" << endl;

for (i = 1; i < XMLdata.documentElement().childNodes().length(); i++)

cout << XMLdata.documentElement().childNodes().item(i).toElement().attribute("time& quot;).toStdString() << "; ";

cout << endl;

Результат работы :

array

27 13:0:52; 27 13:1:2; 27 13:1:6;

Т.е. видно, что элементы разные, а не одинакоые, как я ожидал. Подозреваю, что делаю неверно, но в чем ? Не один раз уже прочел доки по QT-классам для работы с DOM, вроде все должно быть нормально. Где засада ?

anonymous

Это из доки по QT.

QDomNode & QDomNode::operator= ( const QDomNode & n )
Assigns a copy of n to this DOM node.
The data of the copy is shared (shallow copy): modifying one node will also change the other. If you want to make a deep copy, use cloneNode().

А теперь смотри свой код:
XMLdata.documentElement().childNodes().item(i) = value.cloneNode(true);

Вместо этой строки можно написать слип на пару тактов, результат от етого не изменится.

используй QDomNode::replaceChild(const QDomNode & newChild, const QDomNode & oldChild )

Чтото типа этого:
XMLdata.documentElement().replaceChild
(
value.cloneNode(true),
XMLdata.documentElement().childNodes().item(i)
);

zaz ★★★★
()

И еще выдержка из доки

QDomNode QDomNode::replaceChild ( const QDomNode & newChild, const QDomNode & oldChild )
Replaces oldChild with newChild. oldChild must be a direct child of this node.
If newChild is the child of another node, it is reparented to this node. If newChild is a child of this node, then its position in the list of children is changed.
If newChild is a QDomDocumentFragment, then oldChild is replaced by all of the children of the fragment.
Returns a new reference to oldChild on success or a null node an failure.

Обрати внимание когда old и new находятся в текущем ноде, помоему как раз то что тебе нужно :)

zaz ★★★★
()
Ответ на: комментарий от zaz

Спасибо большое. Я уже успел прочесить про это метод и сделал все имеено так, но до вашего поста. И все равно спасибо )))

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.