Annotation of embedaddon/libxml2/doc/examples/reader3.c, revision 1.1.1.2
1.1 misho 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
1.1.1.2 ! misho 10: * test: reader3 > reader3.tmp && diff reader3.tmp $(srcdir)/reader3.res
1.1 misho 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
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>