123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- /**
- * section: xmlReader
- * synopsis: Show how to extract subdocuments with xmlReader
- * purpose: Demonstrate the use of xmlTextReaderPreservePattern()
- * to parse an XML file with the xmlReader while collecting
- * only some subparts of the document.
- * (Note that the XMLReader functions require libxml2 version later
- * than 2.6.)
- * usage: reader3
- * test: reader3 > reader3.tmp ; diff reader3.tmp reader3.res ; rm reader3.tmp
- * author: Daniel Veillard
- * copy: see Copyright for the status of this software.
- */
- #include <stdio.h>
- #include <libxml/xmlreader.h>
- #if defined(LIBXML_READER_ENABLED) && defined(LIBXML_PATTERN_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
- /**
- * streamFile:
- * @filename: the file name to parse
- *
- * Parse and print information about an XML file.
- *
- * Returns the resulting doc with just the elements preserved.
- */
- static xmlDocPtr
- extractFile(const char *filename, const xmlChar *pattern) {
- xmlDocPtr doc;
- xmlTextReaderPtr reader;
- int ret;
- /*
- * build an xmlReader for that file
- */
- reader = xmlReaderForFile(filename, NULL, 0);
- if (reader != NULL) {
- /*
- * add the pattern to preserve
- */
- if (xmlTextReaderPreservePattern(reader, pattern, NULL) < 0) {
- fprintf(stderr, "%s : failed add preserve pattern %s\n",
- filename, (const char *) pattern);
- }
- /*
- * Parse and traverse the tree, collecting the nodes in the process
- */
- ret = xmlTextReaderRead(reader);
- while (ret == 1) {
- ret = xmlTextReaderRead(reader);
- }
- if (ret != 0) {
- fprintf(stderr, "%s : failed to parse\n", filename);
- xmlFreeTextReader(reader);
- return(NULL);
- }
- /*
- * get the resulting nodes
- */
- doc = xmlTextReaderCurrentDoc(reader);
- /*
- * Free up the reader
- */
- xmlFreeTextReader(reader);
- } else {
- fprintf(stderr, "Unable to open %s\n", filename);
- return(NULL);
- }
- return(doc);
- }
- int main(int argc, char **argv) {
- const char *filename = "test3.xml";
- const char *pattern = "preserved";
- xmlDocPtr doc;
- if (argc == 3) {
- filename = argv[1];
- pattern = argv[2];
- }
- /*
- * this initialize the library and check potential ABI mismatches
- * between the version it was compiled for and the actual shared
- * library used.
- */
- LIBXML_TEST_VERSION
- doc = extractFile(filename, (const xmlChar *) pattern);
- if (doc != NULL) {
- /*
- * ouptut the result.
- */
- xmlDocDump(stdout, doc);
- /*
- * don't forget to free up the doc
- */
- xmlFreeDoc(doc);
- }
- /*
- * Cleanup function for the XML library.
- */
- xmlCleanupParser();
- /*
- * this is to debug memory for regression tests
- */
- xmlMemoryDump();
- return(0);
- }
- #else
- int main(void) {
- fprintf(stderr, "Reader, Pattern or output support not compiled in\n");
- exit(1);
- }
- #endif
|