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