From 35a201cc8ef0c3f5b2df88d2e528aabee1048348 Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Fri, 30 Apr 2021 18:47:09 +0200 Subject: Initial/Final commit --- libxml2-2.9.10/doc/examples/reader4.c | 122 ++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 libxml2-2.9.10/doc/examples/reader4.c (limited to 'libxml2-2.9.10/doc/examples/reader4.c') diff --git a/libxml2-2.9.10/doc/examples/reader4.c b/libxml2-2.9.10/doc/examples/reader4.c new file mode 100644 index 0000000..5ed5883 --- /dev/null +++ b/libxml2-2.9.10/doc/examples/reader4.c @@ -0,0 +1,122 @@ +/** + * 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 ... ] + * test: reader4 test1.xml test2.xml test3.xml > reader4.tmp && diff reader4.tmp $(srcdir)/reader4.res + * author: Graham Bennett + * copy: see Copyright for the status of this software. + */ + +#include +#include + +#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 interesting + * 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 -- cgit v1.2.3