Edit

kc3-lang/libxml2/testXPath.c

Branch :

  • Show log

    Commit

  • Author : Daniel Veillard
    Date : 2004-03-25 09:35:49
    Hash : ebe25d49
    Message : applied patch from Mark Vadoc avoiding using xmlParse* option and use * debugXML.c testXPath.c xmllint.c xmlschemastypes.c: applied patch from Mark Vadoc avoiding using xmlParse* option and use xmlRead* instead * win32/Makefile.bcb: patch to Borland C++ builder from Eric Zurcher to avoid problems with some pathnames. Daniel

  • testXPath.c
  • /*
     * testXPath.c : a small tester program for XPath.
     *
     * See Copyright for the status of this software.
     *
     * daniel@veillard.com
     */
    
    #include "libxml.h"
    #if defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_DEBUG_ENABLED)
    
    #include <string.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
    
    
    #include <libxml/xpath.h>
    #include <libxml/tree.h>
    #include <libxml/parser.h>
    #include <libxml/debugXML.h>
    #include <libxml/xmlmemory.h>
    #include <libxml/parserInternals.h>
    #include <libxml/xpathInternals.h>
    #include <libxml/xmlerror.h>
    #include <libxml/globals.h>
    #if defined(LIBXML_XPTR_ENABLED)
    #include <libxml/xpointer.h>
    static int xptr = 0;
    #endif
    static int debug = 0;
    static int valid = 0;
    static int expr = 0;
    static int tree = 0;
    static int nocdata = 0;
    static xmlDocPtr document = NULL;
    
    /*
     * Default document
     */
    static xmlChar buffer[] = 
    "<?xml version=\"1.0\"?>\n\
    <EXAMPLE prop1=\"gnome is great\" prop2=\"&amp; linux too\">\n\
      <head>\n\
       <title>Welcome to Gnome</title>\n\
      </head>\n\
      <chapter>\n\
       <title>The Linux adventure</title>\n\
       <p>bla bla bla ...</p>\n\
       <image href=\"linus.gif\"/>\n\
       <p>...</p>\n\
      </chapter>\n\
      <chapter>\n\
       <title>Chapter 2</title>\n\
       <p>this is chapter 2 ...</p>\n\
      </chapter>\n\
      <chapter>\n\
       <title>Chapter 3</title>\n\
       <p>this is chapter 3 ...</p>\n\
      </chapter>\n\
    </EXAMPLE>\n\
    ";
    
    
    static void
    testXPath(const char *str) {
        xmlXPathObjectPtr res;
        xmlXPathContextPtr ctxt;
        
    #if defined(LIBXML_XPTR_ENABLED)
        if (xptr) {
    	ctxt = xmlXPtrNewContext(document, NULL, NULL);
    	res = xmlXPtrEval(BAD_CAST str, ctxt);
        } else {
    #endif
    	ctxt = xmlXPathNewContext(document);
    	ctxt->node = xmlDocGetRootElement(document);
    	if (expr)
    	    res = xmlXPathEvalExpression(BAD_CAST str, ctxt);
    	else {
    	    /* res = xmlXPathEval(BAD_CAST str, ctxt); */
    	    xmlXPathCompExprPtr comp;
    
    	    comp = xmlXPathCompile(BAD_CAST str);
    	    if (comp != NULL) {
    		if (tree) 
    		    xmlXPathDebugDumpCompExpr(stdout, comp, 0);
    
    		res = xmlXPathCompiledEval(comp, ctxt);
    		xmlXPathFreeCompExpr(comp);
    	    } else
    		res = NULL;
    	}
    #if defined(LIBXML_XPTR_ENABLED)
        }
    #endif
        xmlXPathDebugDumpObject(stdout, res, 0);
        xmlXPathFreeObject(res);
        xmlXPathFreeContext(ctxt);
    }
    
    static void
    testXPathFile(const char *filename) {
        FILE *input;
        char expression[5000];
        int len;
    
        input = fopen(filename, "r");
        if (input == NULL) {
            xmlGenericError(xmlGenericErrorContext,
    		"Cannot open %s for reading\n", filename);
    	return;
        }
        while (fgets(expression, 4500, input) != NULL) {
    	len = strlen(expression);
    	len--;
    	while ((len >= 0) && 
    	       ((expression[len] == '\n') || (expression[len] == '\t') ||
    		(expression[len] == '\r') || (expression[len] == ' '))) len--;
    	expression[len + 1] = 0;      
    	if (len >= 0) {
    	    printf("\n========================\nExpression: %s\n", expression) ;
    	    testXPath(expression);
    	}
        }
    
        fclose(input);
    }
    
    int main(int argc, char **argv) {
        int i;
        int strings = 0;
        int usefile = 0;
        char *filename = NULL;
    
        for (i = 1; i < argc ; i++) {
    #if defined(LIBXML_XPTR_ENABLED)
    	if ((!strcmp(argv[i], "-xptr")) || (!strcmp(argv[i], "--xptr")))
    	    xptr++;
    	else 
    #endif
    	if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug")))
    	    debug++;
    	else if ((!strcmp(argv[i], "-valid")) || (!strcmp(argv[i], "--valid")))
    	    valid++;
    	else if ((!strcmp(argv[i], "-expr")) || (!strcmp(argv[i], "--expr")))
    	    expr++;
    	else if ((!strcmp(argv[i], "-tree")) || (!strcmp(argv[i], "--tree")))
    	    tree++;
    	else if ((!strcmp(argv[i], "-nocdata")) ||
    		 (!strcmp(argv[i], "--nocdata")))
    	    nocdata++;
    	else if ((!strcmp(argv[i], "-i")) || (!strcmp(argv[i], "--input")))
    	    filename = argv[++i];
    	else if ((!strcmp(argv[i], "-f")) || (!strcmp(argv[i], "--file")))
    	    usefile++;
        }
        if (valid != 0) xmlDoValidityCheckingDefaultValue = 1;
        xmlLoadExtDtdDefaultValue |= XML_DETECT_IDS;
        xmlLoadExtDtdDefaultValue |= XML_COMPLETE_ATTRS;
        xmlSubstituteEntitiesDefaultValue = 1;
        if (nocdata != 0) {
    	xmlDefaultSAXHandlerInit();
    	xmlDefaultSAXHandler.cdataBlock = NULL;
        }
        if (document == NULL) {
            if (filename == NULL)
    	    document = xmlReadDoc(buffer,NULL,NULL,0);
    	else
    	    document = xmlReadFile(filename,NULL,0);
        }
        for (i = 1; i < argc ; i++) {
    	if ((!strcmp(argv[i], "-i")) || (!strcmp(argv[i], "--input"))) {
    	    i++; continue;
    	}
    	if (argv[i][0] != '-') {
    	    if (usefile)
    	        testXPathFile(argv[i]);
    	    else
    		testXPath(argv[i]);
    	    strings ++;
    	}
        }
        if (strings == 0) {
    	printf("Usage : %s [--debug] [--copy] stringsorfiles ...\n",
    	       argv[0]);
    	printf("\tParse the XPath strings and output the result of the parsing\n");
    	printf("\t--debug : dump a debug version of the result\n");
    	printf("\t--valid : switch on DTD support in the parser\n");
    #if defined(LIBXML_XPTR_ENABLED)
    	printf("\t--xptr : expressions are XPointer expressions\n");
    #endif
    	printf("\t--expr : debug XPath expressions only\n");
    	printf("\t--tree : show the compiled XPath tree\n");
    	printf("\t--nocdata : do not generate CDATA nodes\n");
    	printf("\t--input filename : or\n");
    	printf("\t-i filename      : read the document from filename\n");
    	printf("\t--file : or\n");
    	printf("\t-f     : read queries from files, args\n");
        }
        if (document != NULL) 
    	xmlFreeDoc(document);
        xmlCleanupParser();
        xmlMemoryDump();
    
        return(0);
    }
    #else
    #include <stdio.h>
    int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
        printf("%s : XPath/Debug support not compiled in\n", argv[0]);
        return(0);
    }
    #endif /* LIBXML_XPATH_ENABLED */