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