FILE *file = fopen("contato.xml","wb"); xmlDocPtr doc; //- ponteiro do documanto struct ESTRUTURA_GENÉRICA{ Enum xmlElementType { Typedef xmlNode* xmlNodePtr
Usar uma biblioteca é a melhor idéia que você poder ter ! E principalmente se tratando de uma coisa tão prática como XML !
Reinventar a roda é legal, mas não tem justificativa se a sua roda for "redonda" como todas as outras !
» Post Completo...*** Referências ***
A Libxml2 é uma biblioteca da GNOME e é altamente utilizada, além de ser recomendada pela W3C, que é o órgão regulamentador do padrão XML !
*** O que é XML ?! ***
Talvez você já ouviu falar muito sobre XML, mas o que é XML mesmo ?!
Por exemplo, HTML é um padrão construído em cima do padrão XML, mas XML é HTML? Não mesmo !
Você pode encontrar uma ótima referência sobre XML na www.w3schools.com, eu aprendi muito neste site ! Aliás, ele é muito bom em tudo !
XML é apenas um padrão para descrição dos dados. Ele é todo formado por texto, e quando interpretado te dá um resultado muito próximo a de um banco de dados.
Um exemplo simples de XML seria: contato.xml. Obs.: O seu browser irá interpretar o exemplo, e como sugestão você deve exibir o código-fonte para que você possa ver a formatação do arquivo !
*** XML na programação ***
Primeiro vamos aprender a gerar XML. Que é muito fácil mesmo !
fprintf(file,"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n");
fprintf(file,"<root>\n");
fprintf(file,"\t<contato>\n");
fprintf(file,"\t\t<nome>%s</nome>\n",nome);
fprintf(file,"\t\t<fone>%s</fone>\n",fone);
fprintf(file,"\t\t<email>%s</email>\n",email);
fprintf(file,"\t</contato>\n");
fprintf(file,"</root>");
fclose(file);
É aqui que entra a libxml2. De forma bem genérica você só precisa fazer isto:
xmlNode *root; //- ponteiro raiz
LIBXML_TEST_VERSION
doc = xmlReadFile(file, NULL, 0); //- Uso genérico
root = xmlDocGetRootElement(doc);
função_de_tratamento(root); //- aqui vc já pode trabalhar
xmlFreeDoc(doc);
xmlCleanupParser();
xmlMemoryDump();
*** Documentação Libxml2 ***
Mesmo sendo escrita em c, a libxml2 (e muitas outras) tem conceitos de Orientação a Objetos. Sabendo isso a documentação não será mais uma dor de cabeça.
xmlAttr, xmlDoc, xmlElement, xmlNode. Todos tem a mesma estrutura genérica inicial:
void * _private;
xmlElementType type; //- Identificação
const xmlChar *name; //- Nome
struct _xmlNode *children;
struct _xmlNode *last;
struct _xmlDtd *parent;
struct _xmlNode *next; //- Próximo elemento
struct _xmlNode *prev;
struct _xmlDoc *doc;
...
}
XML_ELEMENT_NODE = 1
XML_ATTRIBUTE_NODE = 2
XML_TEXT_NODE = 3
XML_CDATA_SECTION_NODE = 4
XML_ENTITY_REF_NODE = 5
XML_ENTITY_NODE = 6
XML_PI_NODE = 7
XML_COMMENT_NODE = 8
...
}
.:: Update 05/07/2008 ::.
Depois de algum tempo sem usar a libXML no Dev-Cpp (Devido a alguns probleminhas que antes não pareciam ter solução) resolvi examinar mais a fundo e ver o que eu tinha feito de errado.
No Linux é super de boa, pois a lib é da GNU e não tem porque dar problemas. No Windows também é simples, se você souber o que você está fazendo.
Acabei de descobrir que no Windows a libMXL tem mais duas dependências: libiconv e zlib.
» libiconv acusa erro na compilação: iconv.h: No such file or directory.
» zlib acusa erro na DLL: Você não precisa linkar a lib em seu projeto, mas a DLL zlib1.dll não pode ser esquecida.
Para instalar a libXML no Dev-Cpp use o repositório DevPaks ou o assistente de instalação do Dev-Cpp (WebUpdate) localizado em Ferramentas > Atualizações. Baixe os pacotes libxml2, libiconv e zlib.
Desconfio que o pacote libxml2 versão 2.6.23 tem pequenos problemas, pois tive que fazer algumas correções:
» -lxml2 seria o suficiente para que a lib fosse linkada em nosso projeto, mas tive que linkar com -llibxml2. Minha explicação é que onde deveria existir o arquivo libxml2.a existe o arquivo libxml2.lib... se fosse lib*.a eu não precisaria do prefixo lib.
» libiconv-2.dll. Este é o arquivo exigido quando se roda a aplicação e não iconv.dll como vem na instalação (diretório_do_Dev/bin).
O código de exemplo tem disponível duas versões versões compiladas (windows e Linux)... aproveitem !
*** Link's ***
Download: » Código Fonte
» Documentação libxml2
» Exemplos libxml2
» Definição XML (wikipedia)
» Tutorial XML (Super recomendado)
.:: Menu Rápido ::.
Linux | C/C++ | Downloads | SDL | [×]A melhor maneira de se descobrir uma lib gratuita é nos repositórios do Ubuntu: $apt-cache search lib <palavra_chave> dev
Ou pelo devpaks.org, mas o repositório tem me ajudado mais !!!
- Script's GIMP - Python-Fu !!!
- Dicas Web
- Vídeo Compiz Fusion (Desktop 3D)
- Compilando com gcc e Makefile
- Que tal mudar para Ubuntu ?!
- SDL - A Biblioteca dos Jogos 2D
- Analisador léxico de arquivos script
- Simpatizando com a Libxml2
- AsciiGen - Tabela ASCII em C
- Conexão com API C do MySQL
- Compilando com gcc e Makefile
- DR Tetris 0.3 - Tetris no estilo tradicional !
- DR Quebra-Cabeça disponível para download !!!
- Freeggs - Liberdade aos ovos \o/
Se você quer aprender a programar jogos... SDL !!!
- Carregando mapas 2D no formato TMX
- Controle de tempo e Frame Rate
- SDL em Processamento de Imagens
- SDL_Surface - Introdução detalhada
- Imprimindo texto com SDL_Ttf
- SDL_Collide - Colisão 2D para jogos
- Tocando música e sons com SDL_mixer
- Gerando e carregando mapas 2D em jogos
- SDL - A Biblioteca dos Jogos 2D
terça-feira, 6 de novembro de 2007
Simpatizando com a Libxml2
Usar uma biblioteca é a melhor idéia que você poder ter ! E principalmente se tratando de uma coisa tão prática como XML !
Reinventar a roda é legal, mas não tem justificativa se a sua roda for "redonda" como todas as outras !
» Post Completo...
Postado por
Diogo_RBG
6
comentários
sexta-feira, 2 de novembro de 2007
AsciiGen - Tabela ASCII em C
Vira e mexe, a gente sempre precisa ter uma tabela ASCII em mãos !
E nada mais fácil do que um programa (para Windows e Linux) que além de gerar a tabela ASCII, também possa gerar seu nome em decimal, hexadecimal, etc...
*** Formas de Uso ***
$ ./asciigen - Gera a tabela ASCII.
$ ./asciigen -h - O Help do programa.
Por exemplo: Para gerar meu nome em hexadecimal.
$ ./asciigen -c Diogo_RBG -f:0x%02X, -n:14
0x44,0x69,0x6F,0x67,0x6F,0x5F,0x52,0x42,0x47,
Donwload: » AsciiGen 0.1
---
A outra vantagem é o código fonte, que é muito simples e está todo comentado !!!
Postado por
Diogo_RBG
1 comentários
Tópicos: c_c++
segunda-feira, 22 de outubro de 2007
DR Quebra-Cabeça disponível para download !!!
Propaganda é a alma do negócio ! E pensando dessa forma eu criei uma página para um jogo meu, o Quebra-Cabeça.
» DR Quebra-Cabeça 0.1.1
Esta não é a versão mais nova do meu jogo, infelizmente eu perdi parte do meu código e isso foi o que eu consegui recuperar !
Baixe o jogo, se divirta, e depois poste aqui o que você achou !
Postado por
Diogo_RBG
12
comentários
Tópicos: downloads
segunda-feira, 8 de outubro de 2007
Conexão com API C do MySQL
#include <mysql/mysql.h> $ make
O MySQL é um servidor de banco de dados. Isso significa que ele fica rodando na máquina à espera que uma conexão socket solicite um serviço. Sua API é escrita originalmente em C pela equipe MySQL e depois é transcritas para outras linguagens por outros grupos. É muito comum utilizar o PHP para fazer conexões com o MySQL, mas no meu site a prioridade é C !
Farei uma pequena abordagem da libmysql, até porque também é novidade para mim !
» Post Completo...*** mysqlclient ***
mysqlclient é a nossa API que permite conectar no banco de dados do MySQL. Com ela as coisas se tornam transparentes, de forma que, em vez de você precisar criar uma conexão socket da forma tradicional você apenas utiliza as funções mysql_init(...) e mysql_real_connect(...).
No windows você pode programar com o Dev-Cpp bastando instalar o pacote libmysql, que pode ser encontrado no site do devpacks (libmysql).
No Linux, em distribuições Debian, você pode instalar a biblioteca pelo apt (#sudo apt-get install libmysqlclient15-dev) e compilar com o gcc usando o comando: #gcc -o mysql_teste mysql_teste.c `mysql_config --cflags --libs`
*** Algumas funções ***
Confira a lista completa no manual da MySQL.
*** Exemplo ***
A seguir, estão em destaque algumas das principais linhas de um exemplo que faz uma consulta no banco. O código completo está disponível aqui !
#define host "127.0.0.1"
#define user "banco"
#define senha "senha"
#define banco "banco"
MYSQL *sock = NULL;
int main(void){
//--- socket ---//
sock = mysql_init(0);
...
//--- Conexão ---//
mysql_real_connect(sock,host,user,senha,banco,0,NULL,0);
...
consulta();
...
//--- Fechando a conexão ---//
mysql_close(sock);
return 0;
}
void consulta(){
if( mysql_query(sock,"SELECT * FROM `cliente`") ){
printf("falha: %s.",mysql_error(sock));
}else{
//- solicitando resultado da pesquisa
res = mysql_store_result(sock);
if(res){
num_fields = mysql_num_fields(res);
//--- listando dados ---//
while( (row = mysql_fetch_row(res)) ){
lengths = mysql_fetch_lengths(res);
for(i=0; i<num_fields; i++){
printf("%.*s ", (int)lengths[i], row[i]?row[i]:"NULL");
}
printf("\n");
}
mysql_free_result(res);
}else
printf("Erro: %s\n",mysql_error(sock));
}
}
*** Testando ***
gcc -o mysql_teste mysql_teste.c `mysql_config --cflags --libs`
$ ./mysql_teste
socket... ok.
conexao... ok.
codificacao: latin1
status: Uptime: 17988 Threads: 1 Questions: 377 Slow queries: 0 Opens: 136 Flush tables: 1 Open tables: 18 Queries per second avg: 0.021
linhas: 2
[cod] [nome] [dt_cadastro] [tipo_compra] [em_parcelam] [em_vencim]
1, João Pessoa Filho, 2007-10-07, comum, 0.00, 0.00
2, Maria da Conceição Batista, 2007-10-07, comum, 0.00, 0.00
*** Link's ***---
Não foi grande coisa, mas é por aí que as coisas funcionam. Em PHP você faria em quantas linhas ?! Com menos de um terço talvez, mas em momento algum eu estive comparando isso.
Em breve, um outro post sobre como tornar esta aplicação visual. E todo este código em c fará mais sentido !
Postado por
Diogo_RBG
14
comentários
terça-feira, 2 de outubro de 2007
Vídeo Compiz Fusion (Desktop 3D)
Eu poreria escrever um texto enorme sobre o Linux, mas uma imagem vale mais do que mil palavras !
Os efeitos do vídeo acima são de versões em desenvolvimento do Compiz Fusion (o resultado da fusão do Beryl com o Compiz), e foram divulgados em julho.
É bem provável que venha junto com a versão 7.10 do Ubuntu !
---
Esse vídeo é d++ !!!
Postado por
Diogo_RBG
0
comentários
