summaryrefslogtreecommitdiff
path: root/doc/examples/reader4.c
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2015-10-19 15:37:26 +0300
committerIgor Pashev <pashev.igor@gmail.com>2015-10-19 15:37:26 +0300
commit6c6e567eb34ad0f5a3bd90f6585c521543106401 (patch)
tree7f8dc62f12dd2b720ffdc738d393cd1a8f82921c /doc/examples/reader4.c
parent7421ae696c1ef2fb48adc73ba8564ef2f276d618 (diff)
parent218d404f34d79a8837f9c0230dd9d9f1180b4068 (diff)
downloadlibxml2-pristine-tar.tar.gz
Merge branch 'pristine-tar' of git://anonscm.debian.org/debian-xml-sgml/libxml2 into pristine-tarpristine-tar
Diffstat (limited to 'doc/examples/reader4.c')
-rw-r--r--doc/examples/reader4.c122
1 files changed, 122 insertions, 0 deletions
diff --git a/doc/examples/reader4.c b/doc/examples/reader4.c
new file mode 100644
index 0000000..1289d0d
--- /dev/null
+++ b/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> [ 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 <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