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 */ 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 121