mirror of
https://gitlab.gnome.org/GNOME/libxml2
synced 2025-03-28 21:33:13 +00:00

xmlCleanupParser is dangerous and shouldn't be called in most cases. Being part of the examples led many people to use it incorrectly. xmlMemoryDump is an obsolete way to test for memory leaks.
115 lines
2.9 KiB
C
115 lines
2.9 KiB
C
/**
|
|
* section: xmlReader
|
|
* synopsis: Parse and validate an XML file with an xmlReader
|
|
* purpose: Demonstrate the use of xmlReaderForFile() to parse an XML file
|
|
* validating the content in the process and activating options
|
|
* like entities substitution, and DTD attributes defaulting.
|
|
* (Note that the XMLReader functions require libxml2 version later
|
|
* than 2.6.)
|
|
* usage: reader2 <valid_xml_filename>
|
|
* test: reader2 test2.xml > reader1.tmp && diff reader1.tmp $(srcdir)/reader1.res
|
|
* author: Daniel Veillard
|
|
* copy: see Copyright for the status of this software.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <libxml/xmlreader.h>
|
|
|
|
#ifdef LIBXML_READER_ENABLED
|
|
|
|
/**
|
|
* processNode:
|
|
* @reader: the xmlReader
|
|
*
|
|
* Dump information about the current node
|
|
*/
|
|
static void
|
|
processNode(xmlTextReaderPtr reader) {
|
|
const xmlChar *name, *value;
|
|
|
|
name = xmlTextReaderConstName(reader);
|
|
if (name == NULL)
|
|
name = BAD_CAST "--";
|
|
|
|
value = xmlTextReaderConstValue(reader);
|
|
|
|
printf("%d %d %s %d %d",
|
|
xmlTextReaderDepth(reader),
|
|
xmlTextReaderNodeType(reader),
|
|
name,
|
|
xmlTextReaderIsEmptyElement(reader),
|
|
xmlTextReaderHasValue(reader));
|
|
if (value == NULL)
|
|
printf("\n");
|
|
else {
|
|
if (xmlStrlen(value) > 40)
|
|
printf(" %.40s...\n", value);
|
|
else
|
|
printf(" %s\n", value);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* streamFile:
|
|
* @filename: the file name to parse
|
|
*
|
|
* Parse, validate and print information about an XML file.
|
|
*/
|
|
static void
|
|
streamFile(const char *filename) {
|
|
xmlTextReaderPtr reader;
|
|
int ret;
|
|
|
|
|
|
/*
|
|
* Pass some special parsing options to activate DTD attribute defaulting,
|
|
* entities substitution and DTD validation
|
|
*/
|
|
reader = xmlReaderForFile(filename, NULL,
|
|
XML_PARSE_DTDATTR | /* default DTD attributes */
|
|
XML_PARSE_NOENT | /* substitute entities */
|
|
XML_PARSE_DTDVALID); /* validate with the DTD */
|
|
if (reader != NULL) {
|
|
ret = xmlTextReaderRead(reader);
|
|
while (ret == 1) {
|
|
processNode(reader);
|
|
ret = xmlTextReaderRead(reader);
|
|
}
|
|
/*
|
|
* Once the document has been fully parsed check the validation results
|
|
*/
|
|
if (xmlTextReaderIsValid(reader) != 1) {
|
|
fprintf(stderr, "Document %s does not validate\n", filename);
|
|
}
|
|
xmlFreeTextReader(reader);
|
|
if (ret != 0) {
|
|
fprintf(stderr, "%s : failed to parse\n", filename);
|
|
}
|
|
} else {
|
|
fprintf(stderr, "Unable to open %s\n", filename);
|
|
}
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
if (argc != 2)
|
|
return(1);
|
|
|
|
/*
|
|
* this initialize the library and check potential ABI mismatches
|
|
* between the version it was compiled for and the actual shared
|
|
* library used.
|
|
*/
|
|
LIBXML_TEST_VERSION
|
|
|
|
streamFile(argv[1]);
|
|
|
|
return(0);
|
|
}
|
|
|
|
#else
|
|
int main(void) {
|
|
fprintf(stderr, "XInclude support not compiled in\n");
|
|
return(0);
|
|
}
|
|
#endif
|