Annotation of embedaddon/libxml2/doc/examples/reader3.c, revision 1.1
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
! 10: * test: reader3 > reader3.tmp ; diff reader3.tmp reader3.res ; rm reader3.tmp
! 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>