/ libxml2 / doc / examples / reader2.c
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 $(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