testXPath.c
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:5k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /*
  2.  * testXPath.c : a small tester program for XPath.
  3.  *
  4.  * See Copyright for the status of this software.
  5.  *
  6.  * Daniel.Veillard@w3.org
  7.  */
  8. #ifdef WIN32
  9. #include "win32config.h"
  10. #else
  11. #include "config.h"
  12. #endif
  13. #include "xmlversion.h"
  14. #if defined(LIBXML_XPATH_ENABLED) && defined(LIBXML_DEBUG_ENABLED)
  15. #include <stdio.h>
  16. #include <string.h>
  17. #ifdef HAVE_SYS_TYPES_H
  18. #include <sys/types.h>
  19. #endif
  20. #ifdef HAVE_SYS_STAT_H
  21. #include <sys/stat.h>
  22. #endif
  23. #ifdef HAVE_FCNTL_H
  24. #include <fcntl.h>
  25. #endif
  26. #ifdef HAVE_UNISTD_H
  27. #include <unistd.h>
  28. #endif
  29. #ifdef HAVE_STDLIB_H
  30. #include <stdlib.h>
  31. #endif
  32. #include <libxml/xpath.h>
  33. #include <libxml/tree.h>
  34. #include <libxml/parser.h>
  35. #include <libxml/debugXML.h>
  36. #include <libxml/xmlmemory.h>
  37. static int debug = 0;
  38. static int expr = 0;
  39. static xmlDocPtr document = NULL;
  40. /*
  41.  * Default document
  42.  */
  43. static xmlChar buffer[] = 
  44. "<?xml version="1.0"?>n
  45. <EXAMPLE prop1="gnome is great" prop2="&amp; linux too">n
  46.   <head>n
  47.    <title>Welcome to Gnome</title>n
  48.   </head>n
  49.   <chapter>n
  50.    <title>The Linux adventure</title>n
  51.    <p>bla bla bla ...</p>n
  52.    <image href="linus.gif"/>n
  53.    <p>...</p>n
  54.   </chapter>n
  55.   <chapter>n
  56.    <title>Chapter 2</title>n
  57.    <p>this is chapter 2 ...</p>n
  58.   </chapter>n
  59.   <chapter>n
  60.    <title>Chapter 3</title>n
  61.    <p>this is chapter 3 ...</p>n
  62.   </chapter>n
  63.   <chapter>n
  64.    <title>Chapter 4</title>n
  65.    <p>this is chapter 4 ...</p>n
  66.   </chapter>n
  67.   <chapter>n
  68.    <title>Chapter 5</title>n
  69.    <p>this is chapter 5 ...</p>n
  70.   </chapter>n
  71. </EXAMPLE>n
  72. ";
  73. void xmlXPAthDebugDumpNodeSet(FILE *output, xmlNodeSetPtr cur) {
  74.     int i;
  75.     if (cur == NULL) {
  76. fprintf(output, "NodeSet is NULL !n");
  77. return;
  78.         
  79.     }
  80.     fprintf(output, "Set contains %d nodes:n", cur->nodeNr);
  81.     for (i = 0;i < cur->nodeNr;i++) {
  82.         fprintf(output, "%d", i + 1);
  83. if (cur->nodeTab[i] == NULL)
  84.     fprintf(output, " NULLn");
  85. else if ((cur->nodeTab[i]->type == XML_DOCUMENT_NODE) ||
  86.          (cur->nodeTab[i]->type == XML_HTML_DOCUMENT_NODE))
  87.     fprintf(output, " /n");
  88. else if (cur->nodeTab[i]->type == XML_ATTRIBUTE_NODE)
  89.     xmlDebugDumpAttr(output, (xmlAttrPtr)cur->nodeTab[i], 2);
  90. else
  91.     xmlDebugDumpOneNode(output, cur->nodeTab[i], 2);
  92.     }
  93. }
  94. void xmlXPAthDebugDumpObject(FILE *output, xmlXPathObjectPtr cur) {
  95.     if (cur == NULL) {
  96.         fprintf(output, "Object is empty (NULL)n");
  97. return;
  98.     }
  99.     switch(cur->type) {
  100.         case XPATH_UNDEFINED:
  101.     fprintf(output, "Object is uninitializedn");
  102.     break;
  103.         case XPATH_NODESET:
  104.     fprintf(output, "Object is a Node Set :n");
  105.     xmlXPAthDebugDumpNodeSet(output, cur->nodesetval);
  106.     break;
  107.         case XPATH_BOOLEAN:
  108.     fprintf(output, "Object is a Boolean : ");
  109.     if (cur->boolval) fprintf(output, "truen");
  110.     else fprintf(output, "falsen");
  111.     break;
  112.         case XPATH_NUMBER:
  113.     fprintf(output, "Object is a number : %0gn", cur->floatval);
  114.     break;
  115.         case XPATH_STRING:
  116.     fprintf(output, "Object is a string : ");
  117.     xmlDebugDumpString(output, cur->stringval);
  118.     fprintf(output, "n");
  119.     break;
  120.     }
  121. }
  122. void testXPath(const char *str) {
  123.     xmlXPathObjectPtr res;
  124.     xmlXPathContextPtr ctxt;
  125.     
  126.     ctxt = xmlXPathNewContext(document);
  127.     if (expr)
  128. res = xmlXPathEvalExpression(BAD_CAST str, ctxt);
  129.     else
  130. res = xmlXPathEval(BAD_CAST str, ctxt);
  131.     xmlXPAthDebugDumpObject(stdout, res);
  132.     xmlXPathFreeObject(res);
  133.     xmlXPathFreeContext(ctxt);
  134. }
  135. void testXPathFile(const char *filename) {
  136.     FILE *input;
  137.     char expr[5000];
  138.     input = fopen(filename, "r");
  139.     if (input == NULL) {
  140.         fprintf(stderr, "Cannot open %s for readingn", filename);
  141. return;
  142.     }
  143.     while (fscanf(input, "%s", expr) != EOF) {
  144.         testXPath(expr);
  145.     }
  146.     fclose(input);
  147. }
  148. int main(int argc, char **argv) {
  149.     int i;
  150.     int strings = 0;
  151.     int usefile = 0;
  152.     char *filename = NULL;
  153.     for (i = 1; i < argc ; i++) {
  154. if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug")))
  155.     debug++;
  156. if ((!strcmp(argv[i], "-expr")) || (!strcmp(argv[i], "--expr")))
  157.     expr++;
  158. if ((!strcmp(argv[i], "-i")) || (!strcmp(argv[i], "--input")))
  159.     filename = argv[++i];
  160. if ((!strcmp(argv[i], "-f")) || (!strcmp(argv[i], "--file")))
  161.     usefile++;
  162.     }
  163.     if (document == NULL) {
  164.         if (filename == NULL)
  165.     document = xmlParseDoc(buffer);
  166. else
  167.     document = xmlParseFile(filename);
  168.     }
  169.     for (i = 1; i < argc ; i++) {
  170. if ((!strcmp(argv[i], "-i")) || (!strcmp(argv[i], "--input"))) {
  171.     i++; continue;
  172. }
  173. if (argv[i][0] != '-') {
  174.     if (usefile)
  175.         testXPathFile(argv[i]);
  176.     else
  177. testXPath(argv[i]);
  178.     strings ++;
  179. }
  180.     }
  181.     if (strings == 0) {
  182. printf("Usage : %s [--debug] [--copy] stringsorfiles ...n",
  183.        argv[0]);
  184. printf("tParse the XPath strings and output the result of the parsingn");
  185. printf("t--debug : dump a debug version of the resultn");
  186. printf("t--expr : debug XPath expressions onlyn");
  187. printf("t--input filename : orn");
  188. printf("t-i filename      : read the document from filenamen");
  189. printf("t--file : orn");
  190. printf("t-f     : read queries from files, argsn");
  191.     }
  192.     if (document != NULL) 
  193. xmlFreeDoc(document);
  194.     xmlCleanupParser();
  195.     xmlMemoryDump();
  196.     return(0);
  197. }
  198. #else
  199. #include <stdio.h>
  200. int main(int argc, char **argv) {
  201.     printf("%s : XPath/Debug support not compiled inn", argv[0]);
  202.     return(0);
  203. }
  204. #endif /* LIBXML_XPATH_ENABLED */