Git init
[external/libxml2.git] / doc / examples / reader2.c
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  */
26 static void
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
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
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
118 int main(void) {
119     fprintf(stderr, "XInclude support not compiled in\n");
120     exit(1);
121 }
122 #endif