Irrxml
IrrXML é uma API para ler XML derivada da engine de código-fonte aberto Irrlicht. A principal vantagem da Irrxml é uma API prática e pequena (o download dela é de aproximadamente 100Kb).
A IrrXML na verdade consiste de arquivos de código-fonte C++ e um arquivo de ajuda chm. O código-fonte implementa um leitor de XML de leitura progressiva, ou seja, ele lê cada tag a medida que estas aparecem. Desta forma ela não monta uma árvore, nem possibilita ao programador voltar a um ponto anterior np arquivo XML.
Exemplo de código
O xml usado para este exemplo é:
<teste> <arq>C:\teste</arq> <num_arq>10</num_arq> </teste>
O código para fazer o parse dele é:
#include "../xml/irrXML.h"
#include <cstdlib>
#include <cstring>
using namespace irr;
using namespace irr::io;
void testParse();
void parseTesteTag(IrrXMLReader*);
bool advanceTag( IrrXMLReader* );
char * parseText( IrrXMLReader* );
int main( int argc, char** argv )
testParse();
return 0;
}
// função principal
void testParse(){
IrrXMLReader* xmlReader = createIrrXMLReader("outros/teste.xml");
if( !xmlReader ) {
puts("Não foi possível criar o parser");
exit(EXIT_FAILURE);
}
parseTesteTag(xmlReader);
}
void parseTesteTag(IrrXMLReader* xmlReader){
bool advanced = advanceTag( xmlReader );
if( !advanced ){
puts( "ERRO. Não conseguiu avançar");
exit(-1);
}
if( (xmlReader->getNodeType() != EXN_ELEMENT)
|| (strcmp( xmlReader->getNodeName(), "teste" ) != 0) )
{
puts("Erro no parse. Tag não é teste");
exit(-1);
}
advanced = advanceTag( xmlReader );
if( !advanced ){
puts( "ERRO. Não conseguiu avançar");
exit(-1);
}
if( (xmlReader->getNodeType() == EXN_ELEMENT)
&& (strcmp( xmlReader->getNodeName(), "arq" ) != 0) )
{
puts("Erro no parse. Tag não é arq");
}
//char contents[256];
//
char *arq = parseText( xmlReader );
printf("Arq = %s\n", arq);
if( (xmlReader->getNodeType() == EXN_ELEMENT_END)
&& (strcmp( xmlReader->getNodeName(), "arq" ) != 0) )
{
puts("Erro no parse. Tag não é a tag de fechamento de arq");
exit(-1);
}
advanced = advanceTag( xmlReader );
if( !advanced ){
puts( "ERRO. Não conseguiu avançar");
exit(-1);
}
if( (xmlReader->getNodeType() == EXN_ELEMENT)
&& (strcmp( xmlReader->getNodeName(), "num_arq" ) != 0) )
{
puts("Erro no parse. Tag não é num_arq");
exit(-1);
}
//char contents[256];
//
char *num_arq = parseText( xmlReader );
printf("Num Arq = %s\n", num_arq);
if( (xmlReader->getNodeType() == EXN_ELEMENT_END)
&& (strcmp( xmlReader->getNodeName(), "num_arq" ) != 0) )
{
puts("Erro no parse. Tag não é a tag de fechamento de num_arq");
exit(-1);
}
// faz o parse de texto (incluindo espaço em branco) que não interessa
char *lixo = parseText( xmlReader );
if( (xmlReader->getNodeType() == EXN_ELEMENT_END)
&& (strcmp( xmlReader->getNodeName(), "teste" ) != 0) )
{
puts("Erro no parse. Tag não é a tag de fechamento de teste");
exit(-1);
}
puts( "Sucesso na leitura" );
}
// posiciona na próxima tag de início ou retorna false para declarar
// que não consegue mais ler nada
bool advanceTag( IrrXMLReader* reader ){
bool hasMore = true;
while( (hasMore = reader->read()) ){
if( (reader->getNodeType() == EXN_ELEMENT) ){
return true;
}
}
return false;
}
// faz o parse do elmeento texto
char * parseText( IrrXMLReader* reader ){
//int tamanho = 0;
char* contents = new char[1024];
memset( contents, 0, 1024);
bool hasMore = true;
while( (hasMore = reader->read()) && reader->getNodeType() == EXN_TEXT ){
const char *temp = reader->getNodeData();
strcat( contents, temp );
}
return contents;
}
Links
**To do **
revisão da página: 3, última edição: 01 May 2014 13:12