.:: Menu Rápido ::.

Linux | C/C++ | Downloads | SDL | [×]

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

FILE *file = fopen("contato.xml","wb");
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);

Agora vem a parte que todos estão esperando. Como eu faço para recuperar tudo isso ?!
É aqui que entra a libxml2. De forma bem genérica você só precisa fazer isto:

xmlDocPtr doc; //- ponteiro do documanto
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();

Download: » Código Fonte

*** 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:

struct ESTRUTURA_GENÉRICA{
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;
...
}

E podem ser identificadas por "type":

Enum xmlElementType {
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
...
}

Como você pôde ver, muitos tipos são compatíveis entre si. E ainda existem outros tipos, que na verdade, são os mesmos !

Typedef xmlNode* xmlNodePtr

Para mais informações leia a documentação oficial, pois isto foi só um resumão !

.:: 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)

6 comentários:

Anônimo disse...

Parabéns pelo post Diogo,fabuloso!
A comunidade agradece.

Diogo_RBG disse...

Vlw !!!
Não foi exatamente um tutorial, mas sei que irá orientar muita gente !

CrociDB disse...

Muito bom post cara! =D

COncerteza vai ajudar muita gente!

Flw

Diogo_RBG disse...

Opa !!! Vlw !!!
Mais gente comentando !

Achei que meu blog tava juntando mosca de tão parado !
Seu comentário me animou a escrever muitos outros !

Diogo_RBG disse...

Observação: A libxml permite manipular e criar novos objetos após o carregamento ou simplesmente gerá-los. Não falei nada a respeito, mas é perfeitamente possível.

Vick disse...

Obrigada! Foi o post mais útil que encontrei até agora!