Desenvolvimento - XML

Usando o Boost/C++ para fazer parser de XML

O XML e Altamente RECOMENDADO parágrafo Troca de Informações, com o XML e Possível trafegar Grandes quantidades de Dados de forma legível uma NOS Humanos. Possível e utilizando XML hum criarmos Padrão de Troca de Mensagens e estabelecermos UMA Comunicação Entre hum hum Cliente e Servidor.

por Ricardo Souza de Deus



O XML é altamente recomendado para troca de informações, com o XML é possível trafegar grandes quantidades de dados de forma legível a nós humanos.

É possível utilizando XML criarmos um padrão de troca de mensagens e estabelecermos uma comunicação entre um Cliente e um Servidor.

Uma outra forma bastante usado com XML é o armazenamento de configurações.

Podemos criar um arquivo de configuração para armazenar configurações a serem usadas pelos nosso software na inicialização ou mesmo usarmos para salvar configurações recebidas pelo servidor.

Há algum tempo atrás eu presenciei um projeto que toda a configuração era feita através de arquivos textos, todo o parser era feito em um arquivo “txt” na “mão”, como a configuração era bastante extensa o código era repleto de duplicação de código, totalmente ingessado, a cada nova linha incluida no arquivo “txt” era preciso dar varios tratamentos para conseguir se obter o valor a ser lido, era totalmente sucetível a erros ja que naquele caso existia todo um ritual a ser seguido, como por exemplo espaço em branco depois do sinal de igualdade, enfim era um caos para quem fosse dar manutenção dessa parte.

Uma boa saída para essa situação é empregar o padrão XML nos arquivos de configuração.

Como o parser é feito através de uma biblioteca, o código fica muito mais claro, muito mais legível e muito menos propenso a possíveis erros ao se editar o arquivo, uma vez que uma simples verificação com relação a sintaxe do XML pode ser feito ao abrir o arquivo de configuração em um browser.

O Boost oferece uma biblioteca que pode ser usado para realizar o parser de arquivos XML ou mensagens no fomato XML no mundo C++.

Eu vou descrever em um breve exemplo de como usar o Boost para parsear um arquivo de configuração escrito em XML.

Esse código descrito a seguir funciona apenas no Visual Studio no meu caso a versão 2010, por usar um recurso de variável do tipo automática “auto” que é resolvida em tempo de compilação, pode ser usado como base para ser usado com outras IDE´s ou mesmo em outros sistemas operacionais.

O nosso arquivo de configurção é um arquivo bem simples basicamente alguns tags.

<xml>

                <configs>

                               <config attr="configMode" value="4"/>

                               <config attr="ViewMode" value="2"/>

                               <config attr="OpenMode" value="1"/>

                               <config attr="ShowMode" value="5"/>

                </configs>

</xml>

Nesse arquivo estou usando o atributo “attr” para indicar um tipo de informação e o atributo “value” para indicar o seu valor.

Você pode adaptar o código descrito a seguir, que basicamente consiste em navegar através dos “nós” contido no arquivo e imprimir os seus respectivos valores.

#include <boost/archive/basic_xml_archive.hpp>

#include <boost/property_tree/xml_parser.hpp>

#include <boost/algorithm/string/trim.hpp>

#include <iostream>

#include <string>

void main(void)

{

//essa variavel pt guarda toda a árvore de nós do xml lida do arquivo.

        boost::property_tree::ptree pt;

        //Path para o arquivo, no meu caso encontra-se na mesma pasta do execultavel

        std::string fileName = "config.xml";

        try

        {       //realize o parser propriamente ditto do arquivo

                boost::property_tree::xml_parser::read_xml(

                                             fileName.c_str(),

                                            pt,                                                                                                                               

                                             boost::property_tree::xml_parser::trim_whitespace);

        //pega o nó raiz

        auto c1 = pt.get_child("xml");

        //navegue através de todos os nós filhos da raiz

        for (auto i = c1.begin(); i != c1.end(); i++)

        {

            //pega os filhos deste nós que se esta visitando    

            auto c2 = i->second;

           

            //navegue através dos filhos caso este nó tenha  

            for (auto j = c2.begin();j != c2.end(); j++)

            {

                //pega os valores dos atributos e imprimi na tela

                std::cout<<"attr:"<<j->second.get<std::string>("<xmlattr>.attr")<<" | ";

                std::cout<<"value:"<<j->second.get<std::string>("<xmlattr>.value")<<std::endl;

            }

                }

        }

    catch(...)

    {

        //caso tenha ocorra algum erro

        std::cout << "Error: parser fail!" << std::endl;

        return;

    }

}

Ao execultar esse exemplo você vai encontra uma saida como esta:

attr:configMode | value:

attr:ViewMode | value:2

attr:OpenMode | value:1

attr:ShowMode | value:5

Isso indica que o parser foi realizado com sucesso ja que os valores foram exibidos na tela, a partir desse exemplo é possível armazenar toda informação lida nos atributos dos nós em variáveis tornando assim o seu módulo mais flexivel e não tendo que fazer parser em arqivos textos como eu comentei anteriormente.

Espero ter contribuido com quem esteja precisando realizar parser´s em arquivos xml´s com o uso da linguagem C++.

Até logo

Ricardo Souza de Deus

Ricardo Souza de Deus