File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libxml2 / doc / examples / reader3.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Sun Jun 15 19:53:37 2014 UTC (10 years, 3 months ago) by misho
Branches: libxml2, MAIN
CVS tags: v2_9_1p0, v2_9_1, HEAD
libxml2 2.9.1

    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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>