116ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard/** 216ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard * section: xmlReader 316ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard * synopsis: Parse an XML file with an xmlReader 416ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard * purpose: Demonstrate the use of xmlReaderForFile() to parse an XML file 5f2497c16b223b8be56d0496fc0bce84ed2ce3b6eJohn Fleck * and dump the informations about the nodes found in the process. 6f2497c16b223b8be56d0496fc0bce84ed2ce3b6eJohn Fleck * (Note that the XMLReader functions require libxml2 version later 7f2497c16b223b8be56d0496fc0bce84ed2ce3b6eJohn Fleck * than 2.6.) 816ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard * usage: reader1 <filename> 96842ee810e8ab60fa71d1569bbc91cc392d12a7cDaniel Richard G * test: reader1 test2.xml > reader1.tmp && diff reader1.tmp $(srcdir)/reader1.res 1016ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard * author: Daniel Veillard 1116ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard * copy: see Copyright for the status of this software. 1216ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard */ 1316ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard 1416ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard#include <stdio.h> 1516ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard#include <libxml/xmlreader.h> 1616ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard 172156d4387bf23c9b927341da58bd394bb4946017Daniel Veillard#ifdef LIBXML_READER_ENABLED 182156d4387bf23c9b927341da58bd394bb4946017Daniel Veillard 1916ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard/** 2016ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard * processNode: 2116ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard * @reader: the xmlReader 2216ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard * 2316ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard * Dump information about the current node 2416ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard */ 2516ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillardstatic void 2616ed597a93739ff63d5b26c97978b3696511a8e0Daniel VeillardprocessNode(xmlTextReaderPtr reader) { 2716ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard const xmlChar *name, *value; 2816ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard 2916ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard name = xmlTextReaderConstName(reader); 3016ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard if (name == NULL) 3116ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard name = BAD_CAST "--"; 3216ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard 3316ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard value = xmlTextReaderConstValue(reader); 3416ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard 3516ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard printf("%d %d %s %d %d", 3616ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard xmlTextReaderDepth(reader), 3716ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard xmlTextReaderNodeType(reader), 3816ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard name, 3916ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard xmlTextReaderIsEmptyElement(reader), 4016ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard xmlTextReaderHasValue(reader)); 4116ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard if (value == NULL) 4216ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard printf("\n"); 4316ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard else { 4416ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard if (xmlStrlen(value) > 40) 4516ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard printf(" %.40s...\n", value); 4616ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard else 4716ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard printf(" %s\n", value); 4816ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard } 4916ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard} 5016ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard 5116ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard/** 5216ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard * streamFile: 5316ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard * @filename: the file name to parse 5416ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard * 5516ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard * Parse and print information about an XML file. 5616ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard */ 5716ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillardstatic void 5816ed597a93739ff63d5b26c97978b3696511a8e0Daniel VeillardstreamFile(const char *filename) { 5916ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard xmlTextReaderPtr reader; 6016ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard int ret; 6116ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard 6216ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard reader = xmlReaderForFile(filename, NULL, 0); 6316ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard if (reader != NULL) { 6416ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard ret = xmlTextReaderRead(reader); 6516ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard while (ret == 1) { 6616ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard processNode(reader); 6716ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard ret = xmlTextReaderRead(reader); 6816ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard } 6916ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard xmlFreeTextReader(reader); 7016ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard if (ret != 0) { 7116ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard fprintf(stderr, "%s : failed to parse\n", filename); 7216ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard } 7316ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard } else { 7416ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard fprintf(stderr, "Unable to open %s\n", filename); 7516ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard } 7616ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard} 7716ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard 7816ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillardint main(int argc, char **argv) { 7916ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard if (argc != 2) 8016ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard return(1); 8116ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard 8216ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard /* 8316ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard * this initialize the library and check potential ABI mismatches 8416ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard * between the version it was compiled for and the actual shared 8516ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard * library used. 8616ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard */ 8716ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard LIBXML_TEST_VERSION 8816ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard 8916ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard streamFile(argv[1]); 9016ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard 9116ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard /* 9216ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard * Cleanup function for the XML library. 9316ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard */ 9416ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard xmlCleanupParser(); 954773df2a58be83e1b9b1b55840371acf37386820Daniel Veillard /* 964773df2a58be83e1b9b1b55840371acf37386820Daniel Veillard * this is to debug memory for regression tests 974773df2a58be83e1b9b1b55840371acf37386820Daniel Veillard */ 984773df2a58be83e1b9b1b55840371acf37386820Daniel Veillard xmlMemoryDump(); 9916ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard return(0); 10016ed597a93739ff63d5b26c97978b3696511a8e0Daniel Veillard} 1012156d4387bf23c9b927341da58bd394bb4946017Daniel Veillard 1022156d4387bf23c9b927341da58bd394bb4946017Daniel Veillard#else 1032156d4387bf23c9b927341da58bd394bb4946017Daniel Veillardint main(void) { 1042156d4387bf23c9b927341da58bd394bb4946017Daniel Veillard fprintf(stderr, "XInclude support not compiled in\n"); 1052156d4387bf23c9b927341da58bd394bb4946017Daniel Veillard exit(1); 1062156d4387bf23c9b927341da58bd394bb4946017Daniel Veillard} 1072156d4387bf23c9b927341da58bd394bb4946017Daniel Veillard#endif 108