Обновление XML-файла с помощью Qt DOM
у меня есть приложение, которое строит левое меню, основанное на компоненте дерева 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-файл. Кажется, что если я поймаю текущий узел, я могу добавить к нему ребенка, пока я не понял, как это сделать.
Спасибо за помощь и, очевидно, извините за мой невежество.
1 ответов
QDomElement newCategoriaTag = doc.createElement(QString("categoria"));
QDomElement newNomeTag = doc.createElement(QString("nome"));
QDomText newNomeText = doc.createTextNode(QString("Cupom fiscal 2"));
newNomeTag.appendChild(newNomeText);
newCategoriaTag.appendChild(newNomeTag);
root.appendChild(newCategoriaTag);
в результате:
<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>
<categoria>
<nome>Cupom fiscal 2</nome>
</categoria>
</comandos>