Russian Qt Forum

Qt => XML => Тема начата: Wachburn от Апрель 12, 2010, 12:39



Название: Изменить значение элемента
Отправлено: Wachburn от Апрель 12, 2010, 12:39
Есть XML файл:
Код
XML
<options>
   <payercode>5</payercode>
   <enterprise>Microsoft</enterprise>
   <payerbank>Demark</payerbank>
</options>
 
Нужно достать значение 5 из элемента <payercode>, увеличить его на единицу и записать обратно. Извлечь не проблема, изменить тоже, но как его записать, чтоб не потерять все остальные элементы? Пытаюсь делать так:
Код:
        QDomDocument opt;
        QFile optFile("options.xml");
        optFile.open(QFile::ReadWrite);
        QTextStream out(&optFile);
        opt.setContent(&optFile);

        QDomElement docElement = opt.documentElement(); // получаю корень
        QDomNode node;

        node = docElement.firstChild(); /*для тренировки пытаюсь хотябы какой-нибудь элемент   изменить, т.е. первый */
        std::cout << node.toElement().text().toStdString(); // элемент правильно извлекается

        node.toElement().setNodeValue("wefe");                   // но здесь
        std::cout << node.toElement().text().toStdString();   // он не устанавливается !!!
       
        out.setCodec("UTF-8");
        out << &optFile;
        opt.save(out, 5, QDomNode::EncodingFromTextStream);
        optFile.close();



Название: Re: Изменить значение элемента
Отправлено: alexman от Апрель 12, 2010, 12:58
QDomElement QDomNode::toElement () const - возвращает не ссылку!


Название: Re: Изменить значение элемента
Отправлено: break от Апрель 12, 2010, 13:16
Цитировать
QDomElement QDomNode::toElement () const - возвращает не ссылку!

Это к делу отношения не имеет QDomElement - explicing shared класс

здесь есть ошибка

out.setCodec( QTextCodec::codecForName("UTF-8") );

а не

out.setCodec("UTF-8");

а это вообще не нужно

out << &optFile;

это портит XML файл!

И вообще ты читаешь файл - потом пытаешься опять в него писать - он все время разрастается!


Название: Re: Изменить значение элемента
Отправлено: alexman от Апрель 12, 2010, 13:18
Цитировать
QDomElement QDomNode::toElement () const - возвращает не ссылку!

Это к делу отношения не имеет QDomElement - explicing shared класс


Вот спс! Раньше внимания не обращал!


Название: Re: Изменить значение элемента
Отправлено: break от Апрель 12, 2010, 13:49
так будет работать

Код
C++ (Qt)
int main(int argc, char *argv[])
{
QDomDocument opt;
 
QFile iFile("options.xml");
iFile.open(QFile::ReadOnly);
opt.setContent(&iFile);
 
QDomElement docElement = opt.documentElement(); // получаю корень
QDomNode node;
 
node = docElement.firstChild(); /*для тренировки пытаюсь хотябы какой-нибудь элемент   изменить, т.е. первый */
qDebug() << node.toElement().text(); // элемент правильно извлекается
 
node.childNodes().item(0).setNodeValue( "wefe" ); // такая вот интересная конструкция !
//node.toElement().setNodeValue("wefe");                   // но здесь
qDebug() << node.toElement().text();   // он не устанавливается !!!
 
QFile oFile("options.xml");
oFile.open(QFile::ReadWrite);
 
QTextStream out(&oFile);
out.setCodec( QTextCodec::codecForName("UTF-8") );
//out << &optFile; --- ТРЕШ не надо это здесь!!!!!!!!!!
opt.save(out, 5, QDomNode::EncodingFromTextStream);
oFile.close();
}
 

только я в упор не пойму почему тролли не сделали метод setText для QDomElement


Название: Re: Изменить значение элемента
Отправлено: Wachburn от Апрель 12, 2010, 15:22
так будет работать

Код
C++ (Qt)
int main(int argc, char *argv[])
{
QDomDocument opt;
 
QFile iFile("options.xml");
iFile.open(QFile::ReadOnly);
opt.setContent(&iFile);
 
QDomElement docElement = opt.documentElement(); // получаю корень
QDomNode node;
 
node = docElement.firstChild(); /*для тренировки пытаюсь хотябы какой-нибудь элемент   изменить, т.е. первый */
qDebug() << node.toElement().text(); // элемент правильно извлекается
 
node.childNodes().item(0).setNodeValue( "wefe" ); // такая вот интересная конструкция !
//node.toElement().setNodeValue("wefe");                   // но здесь
qDebug() << node.toElement().text();   // он не устанавливается !!!
 
QFile oFile("options.xml");
oFile.open(QFile::ReadWrite);
 
QTextStream out(&oFile);
out.setCodec( QTextCodec::codecForName("UTF-8") );
//out << &optFile; --- ТРЕШ не надо это здесь!!!!!!!!!!
opt.save(out, 5, QDomNode::EncodingFromTextStream);
oFile.close();
}
 

только я в упор не пойму почему тролли не сделали метод setText для QDomElement


конструкция и правда интересная... спасибо