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 $(srcdir)/reader1.res
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  */
26 static void
processNode(xmlTextReaderPtr reader)27 processNode(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  */
58 static void
streamFile(const char * filename)59 streamFile(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 
main(int argc,char ** argv)93 int 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
main(void)118 int main(void) {
119     fprintf(stderr, "XInclude support not compiled in\n");
120     exit(1);
121 }
122 #endif
123