Обновление 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>