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 DeusO 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