EXPAT usage

来源:互联网 发布:云计算技术发展趋势 编辑:程序博客网 时间:2024/06/11 14:54

Expat can be intimidating due to the many kinds of handlers and options you can set. But you only need to learn four functions in order to do 80% of what you'll want to do with it:

XML_ParserCreate
Create a new parser object.

XML_SetElementHandler
Set handlers for start and end tags.

XML_SetCharacterDataHandler
Set handler for text.

XML_Parse

Pass a buffer full of document to the parser


/***************************************************************** * outline.c * * Copyright 1999, Clark Cooper * All rights reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the license contained in the * COPYING file that comes with the expat distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Read an XML document from standard input and print an element * outline on standard output. * 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#define BUFFSIZE        8192char Buff[BUFFSIZE];int Depth;static void XMLCALLstart(void *data, const char *el, const char **attr){  int i;  for (i = 0; i < Depth; i++)    printf("  ");  printf("%s", el);  for (i = 0; attr[i]; i += 2) {    printf(" %s='%s'", attr[i], attr[i + 1]);  }  printf("\n");  Depth++;}static void XMLCALLend(void *data, const char *el){  Depth--;}intmain(int argc, char *argv[]){  XML_Parser p = XML_ParserCreate(NULL);  if (! p) {    fprintf(stderr, "Couldn't allocate memory for parser\n");    exit(-1);  }  XML_SetElementHandler(p, start, end);  for (;;) {    int done;    int len;    len = (int)fread(Buff, 1, BUFFSIZE, stdin);    if (ferror(stdin)) {      fprintf(stderr, "Read error\n");      exit(-1);    }    done = feof(stdin);    if (XML_Parse(p, Buff, len, done) == XML_STATUS_ERROR) {      fprintf(stderr, "Parse error at line %" XML_FMT_INT_MOD "u:\n%s\n",              XML_GetCurrentLineNumber(p),              XML_ErrorString(XML_GetErrorCode(p)));      exit(-1);    }    if (done)      break;  }  XML_ParserFree(p);  return 0;}


原创粉丝点击