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