xref: /aosp_15_r20/external/libxml2/example/reader1.c (revision 7c5688314b92172186c154356a6374bf7684c3ca)
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