Home | History | Annotate | Download | only in examples
      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
     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
    123