mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-01-14 19:24:06 +03:00
ea7751d53b
* testReader.c xmlreader.c valid.c include/libxml/tree.h include/libxml/valid.h include/libxml/xmlreader.h: working on DTD validation on top of xml reader interfaces. Allows to validate arbitrary large instances. This required some extensions to the valid module interface and augmenting the size of xmlID and xmlRef structs a bit. * uri.c xmlregexp.c: simple cleanup. Daniel
133 lines
2.7 KiB
C
133 lines
2.7 KiB
C
/*
|
|
* testSAX.c : a small tester program for parsing using the SAX API.
|
|
*
|
|
* See Copyright for the status of this software.
|
|
*
|
|
* daniel@veillard.com
|
|
*/
|
|
|
|
#include "libxml.h"
|
|
|
|
#include <string.h>
|
|
#include <stdarg.h>
|
|
|
|
#ifdef HAVE_SYS_TYPES_H
|
|
#include <sys/types.h>
|
|
#endif
|
|
#ifdef HAVE_SYS_STAT_H
|
|
#include <sys/stat.h>
|
|
#endif
|
|
#ifdef HAVE_FCNTL_H
|
|
#include <fcntl.h>
|
|
#endif
|
|
#ifdef HAVE_UNISTD_H
|
|
#include <unistd.h>
|
|
#endif
|
|
#ifdef HAVE_STDLIB_H
|
|
#include <stdlib.h>
|
|
#endif
|
|
#ifdef HAVE_STRING_H
|
|
#include <string.h>
|
|
#endif
|
|
|
|
|
|
#include <libxml/xmlreader.h>
|
|
|
|
int debug = 0;
|
|
int dump = 0;
|
|
int noent = 0;
|
|
int count = 0;
|
|
int valid = 0;
|
|
|
|
static void usage(const char *progname) {
|
|
printf("Usage : %s [options] XMLfiles ...\n", progname);
|
|
printf("\tParse the XML files using the xmlTextReader API\n");
|
|
printf("\t --count: count the number of attribute and elements\n");
|
|
printf("\t --valid: validate the document\n");
|
|
exit(1);
|
|
}
|
|
static int elem, attrs;
|
|
|
|
static void processNode(xmlTextReaderPtr reader) {
|
|
int type;
|
|
|
|
type = xmlTextReaderNodeType(reader);
|
|
if (count) {
|
|
if (type == 1) {
|
|
elem++;
|
|
attrs += xmlTextReaderAttributeCount(reader);
|
|
}
|
|
}
|
|
}
|
|
|
|
static void handleFile(const char *filename) {
|
|
xmlTextReaderPtr reader;
|
|
int ret;
|
|
|
|
if (count) {
|
|
elem = 0;
|
|
attrs = 0;
|
|
}
|
|
|
|
reader = xmlNewTextReaderFilename(filename);
|
|
if (reader != NULL) {
|
|
if (valid)
|
|
xmlTextReaderSetParserProp(reader, XML_PARSER_VALIDATE, 1);
|
|
|
|
/*
|
|
* Process all nodes in sequence
|
|
*/
|
|
ret = xmlTextReaderRead(reader);
|
|
while (ret == 1) {
|
|
processNode(reader);
|
|
ret = xmlTextReaderRead(reader);
|
|
}
|
|
|
|
/*
|
|
* Done, cleanup and status
|
|
*/
|
|
xmlFreeTextReader(reader);
|
|
if (ret != 0) {
|
|
printf("%s : failed to parse\n", filename);
|
|
} else if (count)
|
|
printf("%s : %d elements, %d attributes\n", filename, elem, attrs);
|
|
} else {
|
|
fprintf(stderr, "Unable to open %s\n", filename);
|
|
}
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
int i;
|
|
int files = 0;
|
|
|
|
if (argc <= 1) {
|
|
usage(argv[0]);
|
|
return(1);
|
|
}
|
|
LIBXML_TEST_VERSION
|
|
for (i = 1; i < argc ; i++) {
|
|
if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug")))
|
|
debug++;
|
|
else if ((!strcmp(argv[i], "-dump")) || (!strcmp(argv[i], "--dump")))
|
|
dump++;
|
|
else if ((!strcmp(argv[i], "-count")) || (!strcmp(argv[i], "--count")))
|
|
count++;
|
|
else if ((!strcmp(argv[i], "-valid")) || (!strcmp(argv[i], "--valid")))
|
|
valid++;
|
|
else if ((!strcmp(argv[i], "-noent")) ||
|
|
(!strcmp(argv[i], "--noent")))
|
|
noent++;
|
|
}
|
|
if (noent != 0) xmlSubstituteEntitiesDefault(1);
|
|
for (i = 1; i < argc ; i++) {
|
|
if (argv[i][0] != '-') {
|
|
handleFile(argv[i]);
|
|
files ++;
|
|
}
|
|
}
|
|
xmlCleanupParser();
|
|
xmlMemoryDump();
|
|
|
|
return(0);
|
|
}
|