[xml] Comparing with Expat



Hi,
     I am new to using any XML Parser. From whatever i could read from net, i found that libxml is comprehensive and it is comparable in performance to Expat. Even i referred a few benchmarks, which placed both Expat and libxml2 very close. I just downloaded the latest version. The task in my program is read a file and print the tokens in it(Very simple). In expat,
this is the code, i used.

/* This is simple demonstration of how to use expat. This program
   reads an XML document from standard input and writes a line with
   the name of each element to standard output indenting child
   elements by one tab stop more than their parent element.
   It must be used with Expat compiled for UTF-8 output.
*/

#include <stdio.h>
#include "expat.h"

#if defined(__amigaos__) && defined(__USE_INLINE__)
#include <proto/expat.h>
#endif

#ifdef XML_LARGE_SIZE
#if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400
#define XML_FMT_INT_MOD "I64"
#else
#define XML_FMT_INT_MOD "ll"
#endif
#else
#define XML_FMT_INT_MOD "l"
#endif

static void XMLCALL
startElement(void *userData, const char *name, const char **atts)
{
  int i;
  int *depthPtr = (int *)userData;
  for (i = 0; i < *depthPtr; i++)
    putchar('\t');
  puts(name);
  *depthPtr += 1;
}

static void XMLCALL
endElement(void *userData, const char *name)
{
  int *depthPtr = (int *)userData;
  *depthPtr -= 1;
}

int
main(int argc, char *argv[])
{
  char buf[BUFSIZ];
  XML_Parser parser = XML_ParserCreate(NULL);
  int done;
  int depth = 0;
  XML_SetUserData(parser, &depth);
  XML_SetElementHandler(parser, startElement, endElement);
  do {
    int len = (int)fread(buf, 1, sizeof(buf), stdin);
    done = len < sizeof(buf);
    if (XML_Parse(parser, buf, len, done) == XML_STATUS_ERROR) {
      fprintf(stderr,
              "%s at line %" XML_FMT_INT_MOD "u\n",
              XML_ErrorString(XML_GetErrorCode(parser)),
              XML_GetCurrentLineNumber(parser));
      return 1;
    }
  } while (!done);
  XML_ParserFree(parser);
  return 0;
}

In Libxml, i used the example-1 program from xmlTextReader. The result was libxml was 5 times slower than Expat. If i read it from memory, it is 2 times slower than Expat.  I searched a lot on tuning the simple libxml program, which was in the example, with no success. Can someone help me in this regard?

The input xml file looks like this.

<Books>
     <Book> <Author> A </Author> <Price> 43</Price>
         <Book> <Author> A </Author> <Price> 43</Price>
           <Book> <Author> A </Author> <Price> 43</Price>
           <Book> <Author> A </Author> <Price> 43</Price>
</Books>

Thanks in Advance,
Gokul.


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]