|
1 /* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd |
|
2 See the file COPYING for copying permission. |
|
3 */ |
|
4 /* This is simple demonstration of how to use expat. This program |
|
5 reads an XML document from standard input and writes a line with |
|
6 the name of each element to standard output indenting child |
|
7 elements by one tab stop more than their parent element. |
|
8 */ |
|
9 |
|
10 #include <stdio.h> |
|
11 #include "expat.h" |
|
12 |
|
13 static void |
|
14 startElement(void *userData, const char *name, const char **atts) |
|
15 { |
|
16 int i; |
|
17 int *depthPtr = userData; |
|
18 for (i = 0; i < *depthPtr; i++) |
|
19 putchar('\t'); |
|
20 puts(name); |
|
21 *depthPtr += 1; |
|
22 } |
|
23 |
|
24 static void |
|
25 endElement(void *userData, const char *name) |
|
26 { |
|
27 int *depthPtr = userData; |
|
28 *depthPtr -= 1; |
|
29 } |
|
30 |
|
31 int |
|
32 main(int argc, char *argv[]) |
|
33 { |
|
34 char buf[BUFSIZ]; |
|
35 XML_Parser parser = XML_ParserCreate(NULL); |
|
36 int done; |
|
37 int depth = 0; |
|
38 XML_SetUserData(parser, &depth); |
|
39 XML_SetElementHandler(parser, startElement, endElement); |
|
40 do { |
|
41 size_t len = fread(buf, 1, sizeof(buf), stdin); |
|
42 done = len < sizeof(buf); |
|
43 if (XML_Parse(parser, buf, len, done) == XML_STATUS_ERROR) { |
|
44 fprintf(stderr, |
|
45 "%s at line %d\n", |
|
46 XML_ErrorString(XML_GetErrorCode(parser)), |
|
47 XML_GetCurrentLineNumber(parser)); |
|
48 return 1; |
|
49 } |
|
50 } while (!done); |
|
51 XML_ParserFree(parser); |
|
52 return 0; |
|
53 } |