123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- /**
- * section: xmlReader
- * synopsis: Parse multiple XML files reusing an xmlReader
- * purpose: Demonstrate the use of xmlReaderForFile() and
- * xmlReaderNewFile to parse XML files while reusing the reader object
- * and parser context. (Note that the XMLReader functions require
- * libxml2 version later than 2.6.)
- * usage: reader4 <filename> [ filename ... ]
- * test: reader4 test1.xml test2.xml test3.xml > reader4.tmp ; diff reader4.tmp reader4.res ; rm reader4.tmp
- * author: Graham Bennett
- * copy: see Copyright for the status of this software.
- */
- #include <stdio.h>
- #include <libxml/xmlreader.h>
- #ifdef LIBXML_READER_ENABLED
- static void processDoc(xmlTextReaderPtr readerPtr) {
- int ret;
- xmlDocPtr docPtr;
- const xmlChar *URL;
- ret = xmlTextReaderRead(readerPtr);
- while (ret == 1) {
- ret = xmlTextReaderRead(readerPtr);
- }
- /*
- * One can obtain the document pointer to get insteresting
- * information about the document like the URL, but one must also
- * be sure to clean it up at the end (see below).
- */
- docPtr = xmlTextReaderCurrentDoc(readerPtr);
- if (NULL == docPtr) {
- fprintf(stderr, "failed to obtain document\n");
- return;
- }
-
- URL = docPtr->URL;
- if (NULL == URL) {
- fprintf(stderr, "Failed to obtain URL\n");
- }
- if (ret != 0) {
- fprintf(stderr, "%s: Failed to parse\n", URL);
- return;
- }
- printf("%s: Processed ok\n", (const char *)URL);
- }
- int main(int argc, char **argv) {
- xmlTextReaderPtr readerPtr;
- int i;
- xmlDocPtr docPtr;
- if (argc < 2)
- return(1);
- /*
- * this initialises the library and check potential ABI mismatches
- * between the version it was compiled for and the actual shared
- * library used.
- */
- LIBXML_TEST_VERSION
- /*
- * Create a new reader for the first file and process the
- * document.
- */
- readerPtr = xmlReaderForFile(argv[1], NULL, 0);
- if (NULL == readerPtr) {
- fprintf(stderr, "%s: failed to create reader\n", argv[1]);
- return(1);
- }
- processDoc(readerPtr);
- /*
- * The reader can be reused for subsequent files.
- */
- for (i=2; i < argc; ++i) {
- xmlReaderNewFile(readerPtr, argv[i], NULL, 0);
- if (NULL == readerPtr) {
- fprintf(stderr, "%s: failed to create reader\n", argv[i]);
- return(1);
- }
- processDoc(readerPtr);
- }
- /*
- * Since we've called xmlTextReaderCurrentDoc, we now have to
- * clean up after ourselves. We only have to do this the last
- * time, because xmlReaderNewFile calls xmlCtxtReset which takes
- * care of it.
- */
- docPtr = xmlTextReaderCurrentDoc(readerPtr);
- if (docPtr != NULL)
- xmlFreeDoc(docPtr);
- /*
- * Clean up the reader.
- */
- xmlFreeTextReader(readerPtr);
- /*
- * Cleanup function for the XML library.
- */
- xmlCleanupParser();
- /*
- * this is to debug memory for regression tests
- */
- xmlMemoryDump();
- return(0);
- }
- #else
- int main(void) {
- fprintf(stderr, "xmlReader support not compiled in\n");
- exit(1);
- }
- #endif
|