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