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 $(srcdir)/reader3.res
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 */
29static xmlDocPtr
30extractFile(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
74int 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
116int main(void) {
117    fprintf(stderr, "Reader, Pattern or output support not compiled in\n");
118    exit(1);
119}
120#endif
121