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