1/**
2 * section: xmlReader
3 * synopsis: Parse an XML file with an xmlReader
4 * purpose: Demonstrate the use of xmlReaderForFile() to parse an XML file
5 *          and dump the informations about the nodes found in the process.
6 *          (Note that the XMLReader functions require libxml2 version later
7 *          than 2.6.)
8 * usage: reader1 <filename>
9 * test: reader1 test2.xml > reader1.tmp && diff reader1.tmp $(srcdir)/reader1.res
10 * author: Daniel Veillard
11 * copy: see Copyright for the status of this software.
12 */
13
14#include <stdio.h>
15#include <libxml/xmlreader.h>
16
17#ifdef LIBXML_READER_ENABLED
18
19/**
20 * processNode:
21 * @reader: the xmlReader
22 *
23 * Dump information about the current node
24 */
25static void
26processNode(xmlTextReaderPtr reader) {
27    const xmlChar *name, *value;
28
29    name = xmlTextReaderConstName(reader);
30    if (name == NULL)
31	name = BAD_CAST "--";
32
33    value = xmlTextReaderConstValue(reader);
34
35    printf("%d %d %s %d %d",
36	    xmlTextReaderDepth(reader),
37	    xmlTextReaderNodeType(reader),
38	    name,
39	    xmlTextReaderIsEmptyElement(reader),
40	    xmlTextReaderHasValue(reader));
41    if (value == NULL)
42	printf("\n");
43    else {
44        if (xmlStrlen(value) > 40)
45            printf(" %.40s...\n", value);
46        else
47	    printf(" %s\n", value);
48    }
49}
50
51/**
52 * streamFile:
53 * @filename: the file name to parse
54 *
55 * Parse and print information about an XML file.
56 */
57static void
58streamFile(const char *filename) {
59    xmlTextReaderPtr reader;
60    int ret;
61
62    reader = xmlReaderForFile(filename, NULL, 0);
63    if (reader != NULL) {
64        ret = xmlTextReaderRead(reader);
65        while (ret == 1) {
66            processNode(reader);
67            ret = xmlTextReaderRead(reader);
68        }
69        xmlFreeTextReader(reader);
70        if (ret != 0) {
71            fprintf(stderr, "%s : failed to parse\n", filename);
72        }
73    } else {
74        fprintf(stderr, "Unable to open %s\n", filename);
75    }
76}
77
78int main(int argc, char **argv) {
79    if (argc != 2)
80        return(1);
81
82    /*
83     * this initialize the library and check potential ABI mismatches
84     * between the version it was compiled for and the actual shared
85     * library used.
86     */
87    LIBXML_TEST_VERSION
88
89    streamFile(argv[1]);
90
91    /*
92     * Cleanup function for the XML library.
93     */
94    xmlCleanupParser();
95    /*
96     * this is to debug memory for regression tests
97     */
98    xmlMemoryDump();
99    return(0);
100}
101
102#else
103int main(void) {
104    fprintf(stderr, "XInclude support not compiled in\n");
105    exit(1);
106}
107#endif
108