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