diff options
author | William Joye <wjoye@cfa.harvard.edu> | 2016-10-19 18:22:05 (GMT) |
---|---|---|
committer | William Joye <wjoye@cfa.harvard.edu> | 2016-10-19 18:22:05 (GMT) |
commit | 34be72f9ed749a5c013d3f7f47d810e8caf652cb (patch) | |
tree | 2f75b6050c088da53d774b3da3fb71e7fa49ec78 /libxml2/doc/examples/reader3.c | |
parent | 604eac5688c5d437ed6d585ee63e53fba6f558c0 (diff) | |
parent | 0f851b6f17365c29b56d6a17564d58a33120508a (diff) | |
download | blt-34be72f9ed749a5c013d3f7f47d810e8caf652cb.zip blt-34be72f9ed749a5c013d3f7f47d810e8caf652cb.tar.gz blt-34be72f9ed749a5c013d3f7f47d810e8caf652cb.tar.bz2 |
Merge commit '0f851b6f17365c29b56d6a17564d58a33120508a' as 'libxml2'
Diffstat (limited to 'libxml2/doc/examples/reader3.c')
-rw-r--r-- | libxml2/doc/examples/reader3.c | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/libxml2/doc/examples/reader3.c b/libxml2/doc/examples/reader3.c new file mode 100644 index 0000000..3eeb61f --- /dev/null +++ b/libxml2/doc/examples/reader3.c @@ -0,0 +1,120 @@ +/** + * 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 $(srcdir)/reader3.res + * 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 |