Home | History | Annotate | Download | only in examples
      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