Russian Qt Forum

Qt => XML => Тема начата: xintrea от Март 19, 2016, 09:53



Название: Затупил. DOM в Qt. Не могу рекурсивно перебрать QDomElement
Отправлено: xintrea от Март 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 и что-нибудь в них изменить?


Название: Re: Затупил. DOM в Qt. Не могу рекурсивно перебрать QDomElement
Отправлено: Old от Март 19, 2016, 10:02
Попробуйте использовать:
QDomElement QDomNode::firstChildElement(const QString & tagName = QString()) const
QDomElement QDomNode::nextSiblingElement(const QString & tagName = QString()) const

Но не факт, что получиться. Возможно придется получать копию элемента, менять атрибут и добавлять ноывй элемент в документ, а старый удалять.