Uma ferramenta simples e funcional para ler os tilemaps dos seus games.
Nós já publicamos sobre o Expat XML que é também uma alternativa para fazer parser de XML.
No entanto, o TinyXML2 é mais simples e tão eficiente quanto o Expat .
TinyXML2 analisa um documento XML e constrói a partir dele um Document Object Model (DOM) que pode ser lido, modificado e salvo.
O TinyXML2 é uma melhoria do TinyXML 1, mas implementação do analisador do TinyXML2 é mais apropriado para uso em games. Ele usa menos memória, é mais rápido e usa muito menos alocações de memória.
Instalando a biblioteca no seu projeto
Eu fiz um fork do projeto original para que o repositório possua menos arquivos e demore menos de você implementar, até porque a biblioteca em si são somente 2 arquivos:o header(tinyxml2.hpp) e o source(tinyxml2.cpp).
Na versão original o header é com extensão .h eu renomeei para tinyxml2.hpp, ou seja, extensão .hpp .
Para implementar utilize o Git para clonar e usar os arquivos tinyxml2.hpp e tinyxml2.cpp para seu projeto.
Nos exemplos abaixo vamos simular um blog em vez de um game que fica mais fácil de entendermos de acordo com artigos .
1. Fazendo parser de um XML com somente uma tag
Primeiro exemplo de um arquivo XML:
primeiro.xml
Arquivo com a função main() com o código: primeiro.cpp
Compile: g++ primeiro.cpp tinyxml2/tinyxml2.cpp e rode: ./a.out
Possível e provável saída:
Note que o elemento root(*p_root_element) é o <title> .
2. Fazendo parser de um XML com duas tags em hierarquia
O elemento root agora é a tag <artigo>
segundo.xml
Consequentemente precisamos criar um ponteiro para o elemento root e informar a tag
segundo.cpp
Possível e provável saída:
Se seu artigo tiver diversos elementos, exemplo:
Seu código seria assim:
Se quiser deixar seu código mais LIKE A BOSS!, use um vector:
Possível e provável saída:
Se usar std::string no seu vector, converta o elems[i] para c_str() assim: elems[i].c_str().
A partir daqui vamos usar essa sintaxe LIKE A BOSS! para os próximos exemplos!
3. Selecionando diversos artigos
O elemento root agora é o <blog>:
terceiro.xml
E o código:
Note que o ponteiro *p_artigo obtém o primeiro elemento do root e o *ptr obtém dele. Para pularmos para o próximo artigo, usamos: p_artigo = p_artigo->NextSiblingElement("artigo"); dentro e ao final do loop while . A condição ternária foi só para separar os artigos.
Possível e provável saída:
4. Filtrando os dados dentro de um elemento sub root
Imagine se houvesse mais um elemento <data> após o root para fazer uma hierarquia mais expressiva, exemplo:
vim quarto.xml
No código teríamos dois loop while e *p_artigo agora obteria o FirstChildElement() de *p_data :
vim quarto.cpp
Possível e provável saída:
Ainda é possível alterar conteúdos, obter nomes de tags, números de linhas e entre outras funcionalidades. Para uma documentação completa veja esse link .
Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!