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