Russian Qt Forum
Май 03, 2024, 17:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Затупил. DOM в Qt. Не могу рекурсивно перебрать QDomElement  (Прочитано 5089 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Март 19, 2016, 09:53 »

У меня в памяти есть QDomDocument. Его нужно сохранить на диск. Перед сохранением надо атрибуты некоторых элементов изменить (расшифровать). Элементы вложены, необходима рекурсия. DOM-элементы должны меняться (менять свои атрибуты) внутри рекурсии.

Примерный код такой:

Код:
void KnowTreeModel::saveDecryptDoc(QDomDocument &doc)
{
  decrypt(doc);

  // Запись DOM данных в файл
  QFile wfile("file.xml");
  QTextStream out(&wfile);
  out.setCodec("UTF-8");
  out << doc.toString();
}


void KnowTreeModel::decrypt(QDomDocument &doc)
{
  QDomElement contentElement=doc.documentElement().firstChildElement("content").firstChildElement("node");

  decryptRecurse(contentElement);

  return;
}


void KnowTreeModel::decryptRecurse(QDomElement &element)
{
  // Расшифровка атрибутов
  element.setAttribute("cryptData", decryptMyData(element.attribute("cryptData") ));

  // Рекурсивный вызов дочерних элементов
  QDomNodeList childList=element.childNodes();
  for(int i=0; i<childList.count(); i++) // для QDomNodeList цикл foreach не работает
    if(childList.at(i).isElement())
      decryptRecurse(childList.at(i).toElement()); // <!-- Что тут надо написать ???
}

Проблема в том, что рекурсивная функция должна работать через QDomElement (долго объяснять почему, проект большой). А я не могу понять, как у QDomElement получить дочерние QDomElement.

У QDomElement есть только возможность получить QDomNodeList, но тип у полученных элементов - QDomNode.

А у этого QDomNode невозможно получить указатель на QDomElement, можно только получить новый QDomElement через метод toElement().

(Блин, вообще-то мне нужна ссылка на QDomElement, но я уже сломал мосг).

В общем, вопрос в следующем: как у QDomElement перебрать дочерние QDomElement и что-нибудь в них изменить?
Записан

Собираю информацию по крупицам
http://webhamster.ru
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #1 : Март 19, 2016, 10:02 »

Попробуйте использовать:
QDomElement QDomNode::firstChildElement(const QString & tagName = QString()) const
QDomElement QDomNode::nextSiblingElement(const QString & tagName = QString()) const

Но не факт, что получиться. Возможно придется получать копию элемента, менять атрибут и добавлять ноывй элемент в документ, а старый удалять.
« Последнее редактирование: Март 19, 2016, 10:04 от Old » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 22.