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

xml
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-Share Alike 2.5 License.