Russian Qt Forum

Qt => XML => Тема начата: Blayder от Июль 15, 2009, 01:16



Название: изменение значения ноды XML
Отправлено: 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>
 


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

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


Название: Re: изменение значения ноды XML
Отправлено: break от Июль 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()) и работать с ним. В нем переопределен оператор присваения - как минимум через это по идее можно занести новые значения...

А вообще все это в ассистенте есть.


Название: Re: изменение значения ноды XML
Отправлено: Blayder от Июль 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>
 
По сути, в моей данной конкретно задаче, не обязательно изменение строго одного элемента и я могу себе позволить перестроить весь хмл заново...


Название: Re: изменение значения ноды XML
Отправлено: break от Июль 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 - также есть в моем примере...


Название: Re: изменение значения ноды XML
Отправлено: warlock от Февраль 13, 2010, 16:59
Поднимаю тему. Каким образом можно изменить значение узла?
Есть например такой файлик:
Код
XML
<doc>
<entry>Hello</entry>
<entry>Buy</entry>
</doc>

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



Название: Re: изменение значения ноды XML
Отправлено: warlock от Февраль 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);