xref: /aosp_15_r20/external/libxml2/example/reader3.c (revision 7c5688314b92172186c154356a6374bf7684c3ca)
1*7c568831SAndroid Build Coastguard Worker /**
2*7c568831SAndroid Build Coastguard Worker  * section: xmlReader
3*7c568831SAndroid Build Coastguard Worker  * synopsis: Show how to extract subdocuments with xmlReader
4*7c568831SAndroid Build Coastguard Worker  * purpose: Demonstrate the use of xmlTextReaderPreservePattern()
5*7c568831SAndroid Build Coastguard Worker  *          to parse an XML file with the xmlReader while collecting
6*7c568831SAndroid Build Coastguard Worker  *          only some subparts of the document.
7*7c568831SAndroid Build Coastguard Worker  *          (Note that the XMLReader functions require libxml2 version later
8*7c568831SAndroid Build Coastguard Worker  *          than 2.6.)
9*7c568831SAndroid Build Coastguard Worker  * usage: reader3
10*7c568831SAndroid Build Coastguard Worker  * test: reader3 > reader3.tmp && diff reader3.tmp $(srcdir)/reader3.res
11*7c568831SAndroid Build Coastguard Worker  * author: Daniel Veillard
12*7c568831SAndroid Build Coastguard Worker  * copy: see Copyright for the status of this software.
13*7c568831SAndroid Build Coastguard Worker  */
14*7c568831SAndroid Build Coastguard Worker 
15*7c568831SAndroid Build Coastguard Worker #include <stdio.h>
16*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlreader.h>
17*7c568831SAndroid Build Coastguard Worker 
18*7c568831SAndroid Build Coastguard Worker #if defined(LIBXML_READER_ENABLED) && defined(LIBXML_PATTERN_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
19*7c568831SAndroid Build Coastguard Worker 
20*7c568831SAndroid Build Coastguard Worker 
21*7c568831SAndroid Build Coastguard Worker /**
22*7c568831SAndroid Build Coastguard Worker  * streamFile:
23*7c568831SAndroid Build Coastguard Worker  * @filename: the file name to parse
24*7c568831SAndroid Build Coastguard Worker  *
25*7c568831SAndroid Build Coastguard Worker  * Parse and print information about an XML file.
26*7c568831SAndroid Build Coastguard Worker  *
27*7c568831SAndroid Build Coastguard Worker  * Returns the resulting doc with just the elements preserved.
28*7c568831SAndroid Build Coastguard Worker  */
29*7c568831SAndroid Build Coastguard Worker static xmlDocPtr
extractFile(const char * filename,const xmlChar * pattern)30*7c568831SAndroid Build Coastguard Worker extractFile(const char *filename, const xmlChar *pattern) {
31*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
32*7c568831SAndroid Build Coastguard Worker     xmlTextReaderPtr reader;
33*7c568831SAndroid Build Coastguard Worker     int ret;
34*7c568831SAndroid Build Coastguard Worker 
35*7c568831SAndroid Build Coastguard Worker     /*
36*7c568831SAndroid Build Coastguard Worker      * build an xmlReader for that file
37*7c568831SAndroid Build Coastguard Worker      */
38*7c568831SAndroid Build Coastguard Worker     reader = xmlReaderForFile(filename, NULL, 0);
39*7c568831SAndroid Build Coastguard Worker     if (reader != NULL) {
40*7c568831SAndroid Build Coastguard Worker         /*
41*7c568831SAndroid Build Coastguard Worker 	 * add the pattern to preserve
42*7c568831SAndroid Build Coastguard Worker 	 */
43*7c568831SAndroid Build Coastguard Worker         if (xmlTextReaderPreservePattern(reader, pattern, NULL) < 0) {
44*7c568831SAndroid Build Coastguard Worker             fprintf(stderr, "%s : failed add preserve pattern %s\n",
45*7c568831SAndroid Build Coastguard Worker 	            filename, (const char *) pattern);
46*7c568831SAndroid Build Coastguard Worker 	}
47*7c568831SAndroid Build Coastguard Worker 	/*
48*7c568831SAndroid Build Coastguard Worker 	 * Parse and traverse the tree, collecting the nodes in the process
49*7c568831SAndroid Build Coastguard Worker 	 */
50*7c568831SAndroid Build Coastguard Worker         ret = xmlTextReaderRead(reader);
51*7c568831SAndroid Build Coastguard Worker         while (ret == 1) {
52*7c568831SAndroid Build Coastguard Worker             ret = xmlTextReaderRead(reader);
53*7c568831SAndroid Build Coastguard Worker         }
54*7c568831SAndroid Build Coastguard Worker         if (ret != 0) {
55*7c568831SAndroid Build Coastguard Worker             fprintf(stderr, "%s : failed to parse\n", filename);
56*7c568831SAndroid Build Coastguard Worker 	    xmlFreeTextReader(reader);
57*7c568831SAndroid Build Coastguard Worker 	    return(NULL);
58*7c568831SAndroid Build Coastguard Worker         }
59*7c568831SAndroid Build Coastguard Worker 	/*
60*7c568831SAndroid Build Coastguard Worker 	 * get the resulting nodes
61*7c568831SAndroid Build Coastguard Worker 	 */
62*7c568831SAndroid Build Coastguard Worker 	doc = xmlTextReaderCurrentDoc(reader);
63*7c568831SAndroid Build Coastguard Worker 	/*
64*7c568831SAndroid Build Coastguard Worker 	 * Free up the reader
65*7c568831SAndroid Build Coastguard Worker 	 */
66*7c568831SAndroid Build Coastguard Worker         xmlFreeTextReader(reader);
67*7c568831SAndroid Build Coastguard Worker     } else {
68*7c568831SAndroid Build Coastguard Worker         fprintf(stderr, "Unable to open %s\n", filename);
69*7c568831SAndroid Build Coastguard Worker 	return(NULL);
70*7c568831SAndroid Build Coastguard Worker     }
71*7c568831SAndroid Build Coastguard Worker     return(doc);
72*7c568831SAndroid Build Coastguard Worker }
73*7c568831SAndroid Build Coastguard Worker 
main(int argc,char ** argv)74*7c568831SAndroid Build Coastguard Worker int main(int argc, char **argv) {
75*7c568831SAndroid Build Coastguard Worker     const char *filename = "test3.xml";
76*7c568831SAndroid Build Coastguard Worker     const char *pattern = "preserved";
77*7c568831SAndroid Build Coastguard Worker     xmlDocPtr doc;
78*7c568831SAndroid Build Coastguard Worker 
79*7c568831SAndroid Build Coastguard Worker     if (argc == 3) {
80*7c568831SAndroid Build Coastguard Worker         filename = argv[1];
81*7c568831SAndroid Build Coastguard Worker 	pattern = argv[2];
82*7c568831SAndroid Build Coastguard Worker     }
83*7c568831SAndroid Build Coastguard Worker 
84*7c568831SAndroid Build Coastguard Worker     /*
85*7c568831SAndroid Build Coastguard Worker      * this initialize the library and check potential ABI mismatches
86*7c568831SAndroid Build Coastguard Worker      * between the version it was compiled for and the actual shared
87*7c568831SAndroid Build Coastguard Worker      * library used.
88*7c568831SAndroid Build Coastguard Worker      */
89*7c568831SAndroid Build Coastguard Worker     LIBXML_TEST_VERSION
90*7c568831SAndroid Build Coastguard Worker 
91*7c568831SAndroid Build Coastguard Worker     doc = extractFile(filename, (const xmlChar *) pattern);
92*7c568831SAndroid Build Coastguard Worker     if (doc != NULL) {
93*7c568831SAndroid Build Coastguard Worker         /*
94*7c568831SAndroid Build Coastguard Worker 	 * output the result.
95*7c568831SAndroid Build Coastguard Worker 	 */
96*7c568831SAndroid Build Coastguard Worker         xmlDocDump(stdout, doc);
97*7c568831SAndroid Build Coastguard Worker 	/*
98*7c568831SAndroid Build Coastguard Worker 	 * don't forget to free up the doc
99*7c568831SAndroid Build Coastguard Worker 	 */
100*7c568831SAndroid Build Coastguard Worker 	xmlFreeDoc(doc);
101*7c568831SAndroid Build Coastguard Worker     }
102*7c568831SAndroid Build Coastguard Worker 
103*7c568831SAndroid Build Coastguard Worker     return(0);
104*7c568831SAndroid Build Coastguard Worker }
105*7c568831SAndroid Build Coastguard Worker 
106*7c568831SAndroid Build Coastguard Worker #else
main(void)107*7c568831SAndroid Build Coastguard Worker int main(void) {
108*7c568831SAndroid Build Coastguard Worker     fprintf(stderr, "Reader, Pattern or output support not compiled in\n");
109*7c568831SAndroid Build Coastguard Worker     return(0);
110*7c568831SAndroid Build Coastguard Worker }
111*7c568831SAndroid Build Coastguard Worker #endif
112