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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: изменение значения ноды XML  (Прочитано 6684 раз)
Blayder
Гость
« : Июль 15, 2009, 01:16 »

Идея такова - сохранять некие значения элементов в XML файле:
Код
XML
<ROOT>
   <act>
       <MinToTray>0</MinToTray>
       <RowLimit>0</RowLimit>
       <LimitTo>20</LimitTo>
       <Refresh>0</Refresh>
       <RefreshTime>20</RefreshTime>
   </act>
   <notif>
       <NewRem>
           <popup>0</popup>
           <sound>0</sound>
           <soundpath>sound\chimes.wav</soundpath>
       </NewRem>
       <EndRem>
           <popup>0</popup>
           <sound>0</sound>
           <soundpath>sound\notify.wav</soundpath>
       </EndRem>
   </notif>
   <autoconnect>
       <enable>0</enable>
       <user>user</user>
       <pass>pass</pass>
   </autoconnect>
   <dbconf>
       <name>db_name</name>
       <addr>hostname</addr>
   </dbconf>
</ROOT>
 


Получаю требуемые значение таким обьразом(наверняка метод кривой, но эт все до чего я за весь седняшний вечер допер  Веселый ):
Код
doc.documentElement().firstChildElement("act").firstChildElement("MinToTray").text()
Что дает нам результат "0"... В принципе то, что надо...
И тут проблемка вышла...

Как мне изменить данное значение?
Или же единственный вариант - это заново генерировать хмл файлик с новыми значениями, потом сохранять его и заного загружать с примененными изменениями?
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #1 : Июль 15, 2009, 03:04 »

если бы у вас были атрибуты а не текстовые ноды что-то типа такого
Код
XML
<act>
       <MinToTray>value="0"</MinToTray>
       <RowLimit>value="0"</RowLimit>
       <LimitTo>value="20"</LimitTo>
       <Refresh>value="0"</Refresh>
       <RefreshTime>value="20"</RefreshTime>
</act>
 

То для работы можно было бы использовать соответствующие методы attribure/setAttribute в QDomElement.

А так получается из QDomNode брать QDomText (методы isText() toText()) и работать с ним. В нем переопределен оператор присваения - как минимум через это по идее можно занести новые значения...

А вообще все это в ассистенте есть.
Записан
Blayder
Гость
« Ответ #2 : Июль 15, 2009, 09:15 »

Хм... Попробую поменять под вашу рекомендацию...
В асистенте то есть описания функций и т.д., но без элементарных примеров по использованию этих функций - извините, я не осилил...
А существующий пример DomXMLBookmarks уж извините - слишком громоздок и страдает на наличие хороших поясняющих коментариев, что как и где делается, дабы по нему учиться...
Поэтому уповаю на вашу милость  Плачущий

П.С. Почитав асситент еще немного, понял Вашу идею, но Вы немного не так её изложили.
проведя эксперимент, выяснил, что аттрибут указывается так:
Код
XML
<act>
 <MinToTray value="0"> </MinToTray>
 <RowLimit value="0"> </RowLimit>
 <LimitTo value="20"> </LimitTo>
 <Refresh value="0"> </Refresh>
 <RefreshTime value="20"> </RefreshTime>
</act>
 
По сути, в моей данной конкретно задаче, не обязательно изменение строго одного элемента и я могу себе позволить перестроить весь хмл заново...
« Последнее редактирование: Июль 15, 2009, 16:35 от Blayder » Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #3 : Июль 15, 2009, 15:31 »

Еще можете использовать QSettings и XML

http://www.prog.org.ru/index.php?topic=8154.msg58105#msg58105

Там я выкладывал свою реализацию адаптации QSettings к Xml - вроде поддерживает все что может QSettings в том числе вложенные массивы. Кстати можете использовать как несложный пример с комментами.

Если все же будете работать с QDomElement - то вам не .firstChildElement("act") надо использовать а скорее QDomNode -- namedItem()
уже его приводить из QDomNode в QDomElement методом toElement(), далее работать с аттрибутами

Если требуется читать несколько подтегов - табличку такого плана

Код
XML
<table>
 <row> </row>
 <row> </row>
 <row> </row>
 <row> </row>
</table>

то удобно будет использовать метод
Код:
QDomNodeList elementsByTagName ( const QString & tagname ) const
класса QDomElement - а потом по полученному QDomNodeList проходить в цикле и работать с конкретными QDomElement - также есть в моем примере...
« Последнее редактирование: Июль 15, 2009, 15:40 от break » Записан
warlock
Гость
« Ответ #4 : Февраль 13, 2010, 16:59 »

Поднимаю тему. Каким образом можно изменить значение узла?
Есть например такой файлик:
Код
XML
<doc>
<entry>Hello</entry>
<entry>Buy</entry>
</doc>

как можно изменить значения например первой записи entry? Чтобы получилось например так:
Код
XML
<doc>
<entry>Hello world</entry>
<entry>Buy</entry>
</doc>

Записан
warlock
Гость
« Ответ #5 : Февраль 13, 2010, 17:51 »

Сделал так:
Код
C++ (Qt)
QDomNode node = doc.firstChild();
QDomElement oldValue = node.firstChildElement("entry");
QDomElement newValue = doc.createElement("entry");
QDomText newValueText = doc.createTextNode("Hello World");
newValue.appendChild(newValueText);
node.replaceChild(newValue, oldValue);
« Последнее редактирование: Февраль 13, 2010, 17:53 от warlock » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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