XML e C: Preparando terreno para Collada…

Eis uma pequena dica de como é simples lidar com arquivos XML usando a libxml2. A primeira coisa a fazer é acessar o documento (o arquivo XML):

/* Adicionar -I/usr/include/libxml2 na lista de opções
   do compilador GCC */
#include <libxml/parser.h>

xmlDocPtr pXmldoc;
xmlNodePtr pRootNode;

if ((pXmlDoc = xmlParseFile("mydoc.xml")) == NULL)
{
  fprintf(stderr, "Error parsing xml file.\n");
  exit( EXIT_FAILURE );
}

if ((pRootNode = xmlDocGetRootElement(pXmlDoc)) == NULL)
{
  fprintf(stderr, "Error getting xml document root element.\n");
  xmlFreeDoc(pXmlDoc);
  exit( EXIT_FAILURE );
}

A chamada a xmlParseFile pode ser substituída por xmlCtxtReadFile, por exemplo, caso você queira validar DTDs e outras coisas… Só dá um pouco mais de trabalho  para inicializar o contexto…

De posse do ponteiro para o nó raiz basta usar membros da estrutura xmlNode para obter nós filhos. A libxml2 implementa também o padrão XPath, interfaces para lidar com Schemes e um conjunto bem rico de funções para lidarmos com nós e elementos. Consulte o site do desenvolvedor (aqui). Existe também um tutorial muito bom (aqui).

Por exemplo: Para listar todos os nós filhos do nó raiz, nada mais fácil:

xmlNodePtr pNode;
xmlChar *element;

for (pNode = pRootNode->xmlChildrenNode; pNode != NULL; pNode = pNode->next)
{
  element = xmlNodeListGetString(pXmlDoc, pNode, 1);
  printf("Child Element '%s'\n", element);
}

Compare a libxml2 com o famigerado MSXML.DomDocument da M$…  Além desse último usar COM (e tem uma série de lenga-lengas com reference counting, threading models, etc), o libxml2 é mais simples, mais rápido e totalmente feito em C.

Onde o Collada entra nisso? No SourceForge existe uma lib chamada ColladaDOM que é baseada exclusivamente na libxml2. A especificação Collada é dedicada ao armazenamento de scene graphs e é uma das especificações da Kronos, dona do OpenGL.

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s