У меня есть приложение, которое создает левое меню, основанное на компоненте дерева Qt.Чтобы загрузить его, мне нужно проанализировать файл XML.Файл XML выглядит следующим образом:
<comandos>
<categoria>
<nome>Cupom fiscal</nome>
<comando>
<nome>01 - Abrir Cupom Fiscal</nome>
<env>3</env>
<rec>4</rec>
<desc>CNPJ / CPF : </desc>
<desc>Nome : </desc>
<desc>Endereco: </desc>
</comando>
</categoria>
</comandos>
Я действительно могу прочитать этот XML с помощью QtDOM.
QDomDocument doc( "ComandosML" );
QFile file( "comandos.xml" );
int r = 0;
datafields.clear();
receFields.clear();
categories.clear();
if( !file.open( QIODevice::ReadOnly ) )
return -1;
if( !doc.setContent( &file ) )
{
file.close();
return -2;
}
// Ok we are ready to parse DOM
QDomElement root = doc.documentElement();
if( root.tagName() != "comandos" )
return -3;
QDomNode n = root.firstChild();
while( !n.isNull() )
{
QDomElement e = n.toElement();
if( !e.isNull() )
{
if( e.tagName() == "categoria" )
{
QDomNode cat = n.firstChild();
while( !cat.isNull() )
{
QDomElement CatName = cat.toElement();
if ( CatName.tagName() == "nome")
{
QString s = CatName.text();
if ( s != "")
{
categories.push_back(s);
item = new QStandardItem( (s) );
item->setEditable(false);
}
}
if ( CatName.tagName() == "comando")
{
QDomNode params = cat.firstChild();
QString qdCmd;
int env = 0;
int rec = 0;
Categories Desc;
while ( !params.isNull())
{
QDomElement ParamName = params.toElement();
if ( ParamName.tagName() == "nome")
{
qdCmd = ParamName.text();
child = new QStandardItem( (qdCmd) );
child->setEditable( false );
child->setDragEnabled(false);
item->appendRow( child );
}
else
if ( ParamName.tagName() == "env")
{
env = ParamName.text().toInt();
}
else
if ( ParamName.tagName() == "rec")
{
rec = ParamName.text().toInt();
}
else
if ( ParamName.tagName() == "desc")
{
Desc.push_back(ParamName.text());
}
params = params.nextSibling();
}
datafields.insert(pair<QString,int>( qdCmd, env ));
receFields.insert(pair<QString,int>( qdCmd, rec ));
descriptions.insert(pair<QString, Categories>( qdCmd, Desc) );
}
cat= cat.nextSibling();
}
model->setItem(r++,item);
}
}
n = n.nextSibling();
}
file.close();
return 0;
В промежутке между разборками я уже собирал меню.В конце концов, у меня уже есть все возможности для обновления XML, когда пользователь редактирует XML-файл и перезагружает приложение, я просто стираю дерево и заново создаю его.Вы можете видеть, что я также передаю некоторые данные в некоторые структуры, в основном это std :: vector и std :: map.Этот код выше был написан с примерами из документации Qt, которые, между прочим, вполне приличны.
Бывает, что я написал простой диалог, чтобы пользователь избегал редактирования XML.Хорошо, для меня это может быть проще и проще редактировать XML, даже с точки зрения пользователя, но возможные пользователи предпочтут редактировать вещи в диалоге.Это все хорошо.Я могу захватить данные и передать их в приложение.Никаких проблем.
Но мне нужно обновить XML.В основном редактирование будет состоять в обновлении узла путем добавления нового или вставки дочернего узла в under.Как мне обновить узел?Есть ли конкретный способ сделать это?Мой опыт работы с XML невелик, я обычно пишу, обновляю, анализирую txt и двоичные файлы.
Я хочу сделать что-то вроде:
if( root.tagName() != "comandos" )
return -3;
QDomNode n = root.firstChild();
while( !n.isNull() )
{
QDomElement e = n.toElement();
if( !e.isNull() )
{
if( e.tagName() == "categoria" )
{
QDomNode cat = n.firstChild();
while( !cat.isNull() )
{
QDomElement CatName = cat.toElement();
if ( CatName.tagName() == "nome")
{
QString s = CatName.text();
if ( s != qsCategory )
{
// we have not found the category
// add it here
}
else
{
// the category exists simply update
}
}
cat= cat.nextSibling();
}
}
}
n = n.nextSibling();
}
Кажется, что использование Qt Dom вполне приличнодля разбора и создания файлов XML, но в нем отсутствуют инструменты для обновления.Любая помощь будет высоко ценится, даже пример.
Этот другой поток здесь выглядит полезным
Изменить значение QDomElement?
У меня естьПосмотрел в интернете примеры, которые могли бы обновить файл XML.Кажется, что если я поймаю текущий узел, то смогу добавить к нему дочерний элемент, но пока я не понял, как это сделать.
Спасибо за помощь и, очевидно, извините за мое невежество.