Обновление XML-файла с использованием Qt DOM - PullRequest
7 голосов
/ 21 марта 2012

У меня есть приложение, которое создает левое меню, основанное на компоненте дерева 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 Ответ

7 голосов
/ 21 марта 2012

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...