blob: 715deeeca1d13561acf2bdc84c41f8f2288c8aed [file] [log] [blame]
Daniel Veillard1e906612003-12-05 14:57:46 +00001/**
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 * usage: reader3
8 * test: reader3 > reader3.tmp ; diff reader3.tmp reader3.out ; rm reader3.tmp
9 * author: Daniel Veillard
10 * copy: see Copyright for the status of this software.
11 */
12
13#include <stdio.h>
14#include <libxml/xmlreader.h>
15
16/**
17 * streamFile:
18 * @filename: the file name to parse
19 *
20 * Parse and print information about an XML file.
21 *
22 * Returns the resulting doc with just the elements preserved.
23 */
24static xmlDocPtr
25extractFile(const char *filename, const xmlChar *pattern) {
26 xmlDocPtr doc;
27 xmlTextReaderPtr reader;
28 int ret;
29
30 /*
31 * build an xmlReader for that file
32 */
33 reader = xmlReaderForFile(filename, NULL, 0);
34 if (reader != NULL) {
35 /*
36 * add the pattern to preserve
37 */
38 if (xmlTextReaderPreservePattern(reader, pattern) < 0) {
39 fprintf(stderr, "%s : failed add preserve pattern %s\n",
40 filename, (const char *) pattern);
41 }
42 /*
43 * Parse and traverse the tree, collecting the nodes in the process
44 */
45 ret = xmlTextReaderRead(reader);
46 while (ret == 1) {
47 ret = xmlTextReaderRead(reader);
48 }
49 if (ret != 0) {
50 fprintf(stderr, "%s : failed to parse\n", filename);
51 xmlFreeTextReader(reader);
52 return(NULL);
53 }
54 /*
55 * get the resulting nodes
56 */
57 doc = xmlTextReaderCurrentDoc(reader);
58 /*
59 * Free up the reader
60 */
61 xmlFreeTextReader(reader);
62 } else {
63 fprintf(stderr, "Unable to open %s\n", filename);
64 return(NULL);
65 }
66 return(doc);
67}
68
69int main(int argc, char **argv) {
70 const char *filename = "test3.xml";
71 const char *pattern = "preserved";
72 xmlDocPtr doc;
73
74 if (argc == 3) {
75 filename = argv[1];
76 pattern = argv[2];
77 }
78
79 /*
80 * this initialize the library and check potential ABI mismatches
81 * between the version it was compiled for and the actual shared
82 * library used.
83 */
84 LIBXML_TEST_VERSION
85
86 doc = extractFile(filename, (const xmlChar *) pattern);
87 if (doc != NULL) {
88 /*
89 * ouptut the result.
90 */
91 xmlDocDump(stdout, doc);
92 /*
93 * don't forget to free up the doc
94 */
95 xmlFreeDoc(doc);
96 }
97
98
99 /*
100 * Cleanup function for the XML library.
101 */
102 xmlCleanupParser();
103 return(0);
104}