Annotation of embedaddon/libxml2/doc/examples/parse4.c, revision 1.1.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>