crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Получить QDomNode из xml по имени
RazrFalcon
  опции профиля:
сообщение 3.10.2011, 11:53
Сообщение #1


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


...
<example name="example text"/>
...
В XML куча вложений и элементов. Как найти элемент example, кроме как через рекурсивную функцию?
То есть найти его, где бы в xml он не находился.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.10.2011, 11:55
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


можно попробовать открыть файл как текст и найти строку "<example name="
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 3.10.2011, 12:01
Сообщение #3


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Нее... нужен именно QDomNode, так как потом мне нужно будет получить список его дочерних элементов.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.10.2011, 12:13
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


если структура XML не меняется, либо меняется по твоему пожеланию, то ты всегда можешь пройти путь к нужному элементу. Ели же задача стоит в том, чтобы этот элемент искать в неизвестном месте, то кроме как обойти все ветки и найти его - наверное, никак

Цитата
QDomNodeList childNodes () const


вот этот метод тоже пригодится при поиске
Цитата
QDomNode QDomNode::namedItem ( const QString & name ) const
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 3.10.2011, 12:19
Сообщение #5


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Сделал так. Работает.
...
findNode(name,mainNode.firstChild());
qDebug()<<findedNode.toElement().tagName(); // findedNode - глобальная переменная QDomNode findedNode;
...

void GuiInfo::findNode(const QString &name, const QDomNode &node)
{
  if (node.hasChildNodes()) {
    QDomNodeList tempNodeList = node.childNodes();
    for (int i = 0; i<tempNodeList.count(); ++i) {
      if (tempNodeList.at(i).toElement().tagName().contains(name))
        findedNode = tempNodeList.at(i); // когда я получу значение, нужно убить циклы все, как?
      else if (tempNodeList.at(i).hasChildNodes())
        findNode(name,tempNodeList.at(i));
    }
  }
}

Разве что не пойму, как остановить эту рекурсивную функцию.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.10.2011, 12:37
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


как-нибудь так

const QDomNode node GuiInfo::findNode(const QString &name, const QDomNode &node)
{
  if (node.hasChildNodes())
  {
    QDomNodeList tempNodeList = node.childNodes();
    for (int i = 0; i<tempNodeList.count(); ++i)
    {
      if (tempNodeList.at(i).toElement().tagName().contains(name))
      {
        findedNode = tempNodeList.at(i); // когда я получу значение, нужно убить циклы все, как?
        return findedNode;
      }
      else if (tempNodeList.at(i).hasChildNodes())
      {
        findNode(name,tempNodeList.at(i));
      }
    }
  }

  return QDomNode();
}


но за правильность не уверен, так как не пойму, используются тут ссылки на внешние переменные или локальные переменные. Вернул по значению
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 3.10.2011, 12:44
Сообщение #7


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


const QDomNode node GuiInfo::findNode
А можно этот момент объяснить?
const QDomNode GuiInfo::findNode
Это я бы еще понял, но что там делает node?

return QDomNode();
не пойму что возвращаем?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.10.2011, 12:49
Сообщение #8


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


"node" - это очепятка вкралась. В блокноте правил :D

"return QDomNode();"
- возвращаем пустой объект - ведь что-то всё равно нужно вернуть
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 3.10.2011, 13:11
Сообщение #9


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Ааа! Все понял. Про "return QDomNode();" не знал.

Возвращает пустые...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.10.2011, 13:12
Сообщение #10


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


в отладчике гляди, где неправильно дело идёт
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.11.2024, 7:33