Annotation of embedaddon/libxml2/doc/examples/parse4.c, revision 1.1
1.1 ! misho 1: /**
! 2: * section: Parsing
! 3: * synopsis: Parse an XML document chunk by chunk to a tree and free it
! 4: * purpose: Demonstrate the use of xmlCreatePushParserCtxt() and
! 5: * xmlParseChunk() to read an XML file progressively
! 6: * into a tree and and xmlFreeDoc() to free the resulting tree
! 7: * usage: parse4 test3.xml
! 8: * test: parse4 test3.xml
! 9: * author: Daniel Veillard
! 10: * copy: see Copyright for the status of this software.
! 11: */
! 12:
! 13: #include <stdio.h>
! 14: #include <libxml/parser.h>
! 15: #include <libxml/tree.h>
! 16:
! 17: #ifdef LIBXML_PUSH_ENABLED
! 18: static FILE *desc;
! 19:
! 20: /**
! 21: * readPacket:
! 22: * @mem: array to store the packet
! 23: * @size: the packet size
! 24: *
! 25: * read at most @size bytes from the document and store it in @mem
! 26: *
! 27: * Returns the number of bytes read
! 28: */
! 29: static int
! 30: readPacket(char *mem, int size) {
! 31: int res;
! 32:
! 33: res = fread(mem, 1, size, desc);
! 34: return(res);
! 35: }
! 36:
! 37: /**
! 38: * example4Func:
! 39: * @filename: a filename or an URL
! 40: *
! 41: * Parse the resource and free the resulting tree
! 42: */
! 43: static void
! 44: example4Func(const char *filename) {
! 45: xmlParserCtxtPtr ctxt;
! 46: char chars[4];
! 47: xmlDocPtr doc; /* the resulting document tree */
! 48: int res;
! 49:
! 50: /*
! 51: * Read a few first byte to check the input used for the
! 52: * encoding detection at the parser level.
! 53: */
! 54: res = readPacket(chars, 4);
! 55: if (res <= 0) {
! 56: fprintf(stderr, "Failed to parse %s\n", filename);
! 57: return;
! 58: }
! 59:
! 60: /*
! 61: * Create a progressive parsing context, the 2 first arguments
! 62: * are not used since we want to build a tree and not use a SAX
! 63: * parsing interface. We also pass the first bytes of the document
! 64: * to allow encoding detection when creating the parser but this
! 65: * is optional.
! 66: */
! 67: ctxt = xmlCreatePushParserCtxt(NULL, NULL,
! 68: chars, res, filename);
! 69: if (ctxt == NULL) {
! 70: fprintf(stderr, "Failed to create parser context !\n");
! 71: return;
! 72: }
! 73:
! 74: /*
! 75: * loop on the input getting the document data, of course 4 bytes
! 76: * at a time is not realistic but allows to verify testing on small
! 77: * documents.
! 78: */
! 79: while ((res = readPacket(chars, 4)) > 0) {
! 80: xmlParseChunk(ctxt, chars, res, 0);
! 81: }
! 82:
! 83: /*
! 84: * there is no more input, indicate the parsing is finished.
! 85: */
! 86: xmlParseChunk(ctxt, chars, 0, 1);
! 87:
! 88: /*
! 89: * collect the document back and if it was wellformed
! 90: * and destroy the parser context.
! 91: */
! 92: doc = ctxt->myDoc;
! 93: res = ctxt->wellFormed;
! 94: xmlFreeParserCtxt(ctxt);
! 95:
! 96: if (!res) {
! 97: fprintf(stderr, "Failed to parse %s\n", filename);
! 98: }
! 99:
! 100: /*
! 101: * since we don't use the document, destroy it now.
! 102: */
! 103: xmlFreeDoc(doc);
! 104: }
! 105:
! 106: int main(int argc, char **argv) {
! 107: if (argc != 2)
! 108: return(1);
! 109:
! 110: /*
! 111: * this initialize the library and check potential ABI mismatches
! 112: * between the version it was compiled for and the actual shared
! 113: * library used.
! 114: */
! 115: LIBXML_TEST_VERSION
! 116:
! 117: /*
! 118: * simulate a progressive parsing using the input file.
! 119: */
! 120: desc = fopen(argv[1], "rb");
! 121: if (desc != NULL) {
! 122: example4Func(argv[1]);
! 123: fclose(desc);
! 124: } else {
! 125: fprintf(stderr, "Failed to parse %s\n", argv[1]);
! 126: }
! 127:
! 128: /*
! 129: * Cleanup function for the XML library.
! 130: */
! 131: xmlCleanupParser();
! 132: /*
! 133: * this is to debug memory for regression tests
! 134: */
! 135: xmlMemoryDump();
! 136: return(0);
! 137: }
! 138: #else /* ! LIBXML_PUSH_ENABLED */
! 139: int main(int argc, char **argv) {
! 140: fprintf(stderr, "Library not compiled with push parser support\n");
! 141: return(1);
! 142: }
! 143: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>