Main Page | Modules | Class Hierarchy | Class List | Class Members

Micro XML Parser
[Micro XML]


Detailed Description

The Micro XML parser is implemented in pure c, and can be used without the Micro XML DOM. The parser supports input stream buffering, and provides parsed document information via 3 registered callbacks on the created parser object.


Classes

struct  MXMLParser
 XMLParser type returned by MXMLParserCreate. More...

Typedefs

typedef void(* MXMLStartElementCallback )(void *a_userData, const char *a_name, const char **a_attributes)
 parser callback to handle xml start elements
typedef void(* MXMLEndElementCallback )(void *a_userData, const char *a_name)
 parser callback to handle xml end elements
typedef void(* MXMLCharacterDataCallback )(void *a_userData, const char *a_data, size_t a_size, MXMLCharacterDataType a_type)
 parser callback to handle xml element data, a_size does not include terminating char
typedef void *(* MXMLAlloc )(size_t a_size)
 parser alloc callback
typedef void(* MXMLFree )(void *a_mem)
 parser free callback

Functions

MXMLParserMXMLParserCreate (MXMLAlloc a_Alloc, MXMLFree a_Free)
 create a micro xml parser
void MXMLParserDestroy (MXMLParser *a_parser)
 destroy a xml parser
MXMLResult MXMLParserParse (MXMLParser *a_parser, const unsigned char *a_buffer, size_t a_bufferSize, int a_lastBuffer)
 parse function
const char * MXMLParserGetErrorString (MXMLParser *a_parser)
 return an error string if MXMLParserParse returned MXML_RESULT_ERROR


Typedef Documentation

typedef void(* MXMLCharacterDataCallback)(void *a_userData, const char *a_data, size_t a_size, MXMLCharacterDataType a_type)
 

parser callback to handle xml element data, a_size does not include terminating char

Parameters:
a_userData is the user data given to the MXMLParser object
a_data is the character data for the said node type (UTF8)
a_size is the size of the data excluding the null terminating char
a_type is the type of character data

typedef void(* MXMLEndElementCallback)(void *a_userData, const char *a_name)
 

parser callback to handle xml end elements

Parameters:
a_userData is the user data given to the MXMLParser object
a_name is the name of the node (UTF8)

typedef void(* MXMLStartElementCallback)(void *a_userData, const char *a_name, const char **a_attributes)
 

parser callback to handle xml start elements

Parameters:
a_userData is the user data given to the MXMLParser object
a_name is the name of the node (UTF8)
a_attributes is an array of attribute name value pairs (UTF8)


Function Documentation

MXMLParser* MXMLParserCreate MXMLAlloc  a_Alloc,
MXMLFree  a_Free
 

create a micro xml parser

Parameters:
a_Alloc is a memory hook used for all internal memory allocations
a_Free is a memory hook for freeing all memory allocations
Returns:
MXMLParser or NULL on error

void MXMLParserDestroy MXMLParser a_parser  ) 
 

destroy a xml parser

Parameters:
a_parser is a parser created using MXMLParserCreate

MXMLResult MXMLParserParse MXMLParser a_parser,
const unsigned char *  a_buffer,
size_t  a_bufferSize,
int  a_lastBuffer
 

parse function

Parameters:
a_parser is a MXMLParser created with MXMLParserCreate
a_buffer is the current input buffer (UTF8) of size a_bufferSize, and may be a portion of a larger stream
a_bufferSize is the current buffer size in bytes
a_lastBuffer is set to 1 if this is the last input buffer
Returns:
xml parsing result
Below is an example usage of the MXMLParser:


  static void StartElement(void *userData, const char *name, const char **atts)
  {
    printf("<name=%s ", name);
    for(int i = 0; atts[i]; i += 2)
    {
      const char * name = atts[i];
      const char * value = atts[i+1];
      printf(", %s = %s", name, value);
    }
    printf(">\n");
  }

  static void EndElement(void *userData, const char *name)
  {
    printf("</%s>\n", name);
  }

  static void CharacterData(void *userData, const char *s, size_t len, MXMLCharacterDataType a_type)
  {
    printf("%s\n", s);
  }

  static int Load(FILE * f)
  {
    unsigned char buf[8192];
    MXMLParser * parser = MXMLParserCreate(malloc, free);
    int done;

    parser->m_userData = NULL;
    parser->m_StartElementCallback = StartElement;
    parser->m_EndElementCallback = EndElement;
    parser->m_CharacterDataCallback = CharacterData;

    do 
    {
      size_t len = fread(buf, 1, sizeof(buf), f);
      done = len < sizeof(buf);
      if (MXMLParserParse(parser, buf, len, done) == MXML_RESULT_ERROR) 
      {
        MXMLParserGetErrorString(parser);
        MXMLParserDestroy(parser);
        return -1;
      }
    } while (!done);

    MXMLParserDestroy(parser);
    return 0;
  }