1 /**
2 * section: xmlReader
3 * synopsis: Parse an XML file with an xmlReader
4 * purpose: Demonstrate the use of xmlReaderForFile() to parse an XML file
5 * and dump the information about the nodes found in the process.
6 * (Note that the XMLReader functions require libxml2 version later
7 * than 2.6.)
8 * usage: reader1 <filename>
9 * test: reader1 test2.xml > reader1.tmp && diff reader1.tmp $(srcdir)/reader1.res
10 * author: Daniel Veillard
11 * copy: see Copyright for the status of this software.
12 */
13
14 #include <stdio.h>
15 #include <libxml/xmlreader.h>
16
17 #ifdef LIBXML_READER_ENABLED
18
19 /**
20 * processNode:
21 * @reader: the xmlReader
22 *
23 * Dump information about the current node
24 */
25 static void
processNode(xmlTextReaderPtr reader)26 processNode(xmlTextReaderPtr reader) {
27 const xmlChar *name, *value;
28
29 name = xmlTextReaderConstName(reader);
30 if (name == NULL)
31 name = BAD_CAST "--";
32
33 value = xmlTextReaderConstValue(reader);
34
35 printf("%d %d %s %d %d",
36 xmlTextReaderDepth(reader),
37 xmlTextReaderNodeType(reader),
38 name,
39 xmlTextReaderIsEmptyElement(reader),
40 xmlTextReaderHasValue(reader));
41 if (value == NULL)
42 printf("\n");
43 else {
44 if (xmlStrlen(value) > 40)
45 printf(" %.40s...\n", value);
46 else
47 printf(" %s\n", value);
48 }
49 }
50
51 /**
52 * streamFile:
53 * @filename: the file name to parse
54 *
55 * Parse and print information about an XML file.
56 */
57 static void
streamFile(const char * filename)58 streamFile(const char *filename) {
59 xmlTextReaderPtr reader;
60 int ret;
61
62 reader = xmlReaderForFile(filename, NULL, 0);
63 if (reader != NULL) {
64 ret = xmlTextReaderRead(reader);
65 while (ret == 1) {
66 processNode(reader);
67 ret = xmlTextReaderRead(reader);
68 }
69 xmlFreeTextReader(reader);
70 if (ret != 0) {
71 fprintf(stderr, "%s : failed to parse\n", filename);
72 }
73 } else {
74 fprintf(stderr, "Unable to open %s\n", filename);
75 }
76 }
77
main(int argc,char ** argv)78 int main(int argc, char **argv) {
79 if (argc != 2)
80 return(1);
81
82 /*
83 * this initialize the library and check potential ABI mismatches
84 * between the version it was compiled for and the actual shared
85 * library used.
86 */
87 LIBXML_TEST_VERSION
88
89 streamFile(argv[1]);
90
91 /*
92 * Cleanup function for the XML library.
93 */
94 xmlCleanupParser();
95 /*
96 * this is to debug memory for regression tests
97 */
98 xmlMemoryDump();
99 return(0);
100 }
101
102 #else
main(void)103 int main(void) {
104 fprintf(stderr, "XInclude support not compiled in\n");
105 exit(1);
106 }
107 #endif
108