///////////////////////////////////////////////////////////////////////////// // Creation 30/12/2003 // // // TESTEXPAT.C // ----------- // // // Sylvain MARECHAL - sylvain.marechal1@libertysurf.fr ///////////////////////////////////////////////////////////////////////////// // // Show expat usage. // See also the examples folder in expat // // Expat home : http://expat.sourceforge.net/ // ///////////////////////////////////////////////////////////////////////////// #include #include #include // Use a struct or a class to encapsule the data needed // in handlers typedef struct _tagUserExpatData { int Depth; } UserExpatData; // StartElementHandler() handler static void XMLCALL StartElementHandler(void *data, const char *el, const char **attr) { UserExpatData *pUserData =(UserExpatData *)data; int i; printf( "StartElementHandler : el='%s'\n", el ); for (i = 0; i < pUserData->Depth; i++) printf(" "); printf("%s", el); for (i = 0; attr[i]; i += 2) { printf(" %s='%s' (i=%d)", attr[i], attr[i + 1], i); } printf("\n"); pUserData->Depth++; } // EndElementHandler() handler static void XMLCALL EndElementHandler(void *data, const char *el) { UserExpatData *pUserData =(UserExpatData *)data; printf( "EndElementHandler : el='%s'\n", el ); pUserData->Depth--; } // CharacterDataHandler() handler static void XMLCALL CharacterDataHandler(void *data, const XML_Char *s, int len ) { UserExpatData *pUserData =(UserExpatData *)data; char * pxmlCharCopyZ; pxmlCharCopyZ = (char *)malloc( len + 1 ); if( ! pxmlCharCopyZ ) return; // string given isn't asciiZ memcpy( pxmlCharCopyZ, s, len ); pxmlCharCopyZ[len] = 0; printf( "CharacterDataHandler : '%s'\n", pxmlCharCopyZ ); free( pxmlCharCopyZ ); } // Main int main(int argc, char *argv[]) { char Buff[8192]; FILE * hfile = stdin; XML_Parser xmlParser; UserExpatData userData; if( argc >= 2 ) { hfile = fopen( argv[1], "r" ); } if( ! hfile ) hfile = stdin; xmlParser = XML_ParserCreate(NULL); if (! xmlParser ) { fprintf(stderr, "Couldn't allocate memory for parser\n"); exit(-1); } // Set your data to avoid global data usage memset( &userData, 0, sizeof(userData) ); XML_SetUserData( xmlParser, (void *)&userData ); // Set the handlers you are interesting in (look at reference.html) XML_SetElementHandler( xmlParser, StartElementHandler, EndElementHandler); XML_SetCharacterDataHandler( xmlParser, CharacterDataHandler ); // Process the file for (;;) { int done; int len; // Read file len = fread(Buff, 1, /*sizeof(Buff)*/1, hfile); if (ferror(hfile)) { fprintf(stderr, "Read error\n"); exit(-1); } done = feof(hfile); // Parse data readen if( XML_Parse(xmlParser, Buff, len, done) == XML_STATUS_ERROR) { fprintf(stderr, "Parse error at line %d:\n%s\n", XML_GetCurrentLineNumber(xmlParser), XML_ErrorString(XML_GetErrorCode(xmlParser))); exit(-1); } if (done) break; } if( hfile != stdin ) fclose( hfile ); return 0; }