LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2386|回复: 1

为什么libexpat不能正确解析出font.txt文件中各个元素的值?

[复制链接]
发表于 2005-6-27 15:44:36 | 显示全部楼层 |阅读模式
测试用的代码:

  1. #include <stdio.h>
  2. #include <expat.h>

  3. #define BUFFSIZE        8192

  4. char Buff[BUFFSIZE];

  5. int Depth;

  6. static void XMLCALL
  7. start(void *data, const char *el, const char **attr)
  8. {
  9.   int i;

  10.   for (i = 0; i < Depth; i++)
  11.     printf("  ");

  12.   printf("%s", el);

  13.   for (i = 0; attr[i]; i += 2) {
  14.     printf(" %s='%s'", attr[i], attr[i + 1]);
  15.   }

  16.   printf("\n");
  17.   Depth++;
  18. }

  19. static void XMLCALL
  20. end(void *data, const char *el)
  21. {
  22.   Depth--;
  23. }

  24. int
  25. main(int argc, char *argv[])
  26. {
  27.   FILE *fp;
  28.   fp = fopen(argv[1],"r+b");
  29.   XML_Parser p = XML_ParserCreate(NULL);
  30.   if (! p) {
  31.     fprintf(stderr, "Couldn't allocate memory for parser\n");
  32.     exit(-1);
  33.   }

  34.   XML_SetElementHandler(p, start, end);

  35.   for (;;) {
  36.     int done;
  37.     int len;

  38.     len = fread(Buff, 1, BUFFSIZE, fp);
  39.     if (ferror(fp)) {
  40.       fprintf(stderr, "Read error\n");
  41.       exit(-1);
  42.     }
  43.     done = feof(fp);

  44.     if (XML_Parse(p, Buff, len, done) == XML_STATUS_ERROR) {
  45.       fprintf(stderr, "Parse error at line %d:\n%s\n",
  46.               XML_GetCurrentLineNumber(p),
  47.               XML_ErrorString(XML_GetErrorCode(p)));
  48.       exit(-1);
  49.     }

  50.     if (done)
  51.       break;
  52.   }
  53.   return 0;
  54. }

复制代码

我所得的输出如下:

  1. fontconfig
  2.   dir
  3.   alias
  4.     family
  5.     accept
  6.       family
  7.   alias
  8.     family
  9.     accept
  10.       family
  11.   alias
  12.     family
  13.     accept
  14.       family
  15.   alias
  16.     family
  17.     accept
  18.       family
  19.   alias
  20.     family
  21.     accept
  22.       family
  23.   alias
  24.     family
  25.     accept
  26.       family
  27.   alias
  28.     family
  29.     accept
  30.       family
  31.   alias
  32.     family
  33.     accept
  34.       family
  35.   alias
  36.     family
  37.     accept
  38.       family
  39.   alias
  40.     family
  41.     accept
  42.       family
  43.   alias
  44.     family
  45.     accept
  46.       family
  47.   alias
  48.     family
  49.     accept
  50.       family
  51.   alias
  52.     family
  53.     accept
  54.       family
  55.   alias
  56.     family
  57.     accept
  58.       family
  59.   alias
  60.     family
  61.     accept
  62.       family
  63.   alias
  64.     family
  65.     accept
  66.       family
  67.   alias
  68.     family
  69.     accept
  70.       family
  71.   alias
  72.     family
  73.     accept
  74.       family
  75.   alias
  76.     family
  77.     accept
  78.       family
  79.   alias
  80.     family
  81.     accept
  82.       family
  83.   alias
  84.     family
  85.     accept
  86.       family
  87.   alias
  88.     family
  89.     accept
  90.       family
  91.   alias
  92.     family
  93.     accept
  94.       family
  95.   alias
  96.     family
  97.     accept
  98.       family
  99.   alias
  100.     family
  101.     accept
  102.       family
  103.   alias
  104.     family
  105.     accept
  106.       family
  107.   alias
  108.     family
  109.     accept
  110.       family
  111.   alias
  112.     family
  113.     accept
  114.       family
  115.   alias
  116.     family
  117.     accept
  118.       family
  119.   alias
  120.     family
  121.     accept
  122.       family
  123.   alias
  124.     family
  125.     accept
  126.       family
  127.   alias
  128.     family
  129.     accept
  130.       family
  131.   alias
  132.     family
  133.     accept
  134.       family
  135.   alias
  136.     family
  137.     accept
  138.       family
  139.   alias
  140.     family
  141.     accept
  142.       family
  143.   alias
  144.     family
  145.     accept
  146.       family
  147.   alias
  148.     family
  149.     accept
  150.       family
  151.   alias
  152.     family
  153.     accept
  154.       family
  155.   alias
  156.     family
  157.     accept
  158.       family
  159.   alias
  160.     family
  161.     accept
  162.       family
  163.   alias
  164.     family
  165.     accept
  166.       family
  167.   alias
  168.     family
  169.     accept
  170.       family
  171.   alias
  172.     family
  173.     accept
  174.       family
  175.   alias
  176.     family
  177.     accept
  178.       family
  179.   alias
  180.     family
  181.     accept
  182.       family
  183.   alias
  184.     family
  185.     accept
  186.       family
  187.   alias
  188.     family
  189.     accept
  190.       family
  191.   alias
  192.     family
  193.     accept
  194.       family
  195.   alias
  196.     family
  197.     accept
  198.       family
  199.   alias
  200.     family
  201.     accept
  202.       family
  203.   alias
  204.     family
  205.     accept
  206.       family
  207.   alias
  208.     family
  209.     accept
  210.       family
  211.   alias
  212.     family
  213.     default
  214.       family
  215.   alias
  216.     family
  217.     default
  218.       family
  219.   alias
  220.     family
  221.     default
  222.       family
复制代码

就是显示不出来实际的值。不知何故,还清有经验的朋友指教下。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2005-6-27 17:00:53 | 显示全部楼层
原来是没有定义处理元素数据的回调函数:XML_SetCharacterDataHandler()。
我改进了代码,现在XML解析的问题解决了。

  1. /* This is simple demonstration of how to use expat. This program
  2.    reads an XML document from standard input and writes a line with
  3.    the name of each element to standard output indenting child
  4.    elements by one tab stop more than their parent element.
  5.    Modified by Tang.Xu bravetang@tom.com
  6.    2005.6.27
  7. */

  8. #include <stdio.h>
  9. #include <string.h>
  10. #include "expat.h"

  11. static void XMLCALL
  12. startElement(void *userData, const char *name, const char **atts)
  13. {
  14.   int i;
  15.   int *depthPtr = userData;
  16.   for (i = 0; i < *depthPtr; i++)
  17.     putchar('\t');
  18.   puts(name);
  19.   *depthPtr += 1;
  20. }

  21. static void XMLCALL
  22. endElement(void *userData, const char *name)
  23. {
  24.   int *depthPtr = userData;
  25.   *depthPtr -= 1;
  26. }

  27. static void XMLCALL
  28. getData(void *userData,const XML_Char *s,int len)
  29. {
  30.    char strtmp[len+1];
  31.    int i;
  32.    for(i=0;i<len;i++)
  33.     {
  34.       strtmp[i]=s[i];
  35.     }
  36.    strtmp[len]='\0';
  37.    puts(strtmp);
  38. }
  39. int
  40. main(int argc, char *argv[])
  41. {
  42.   FILE *fp;
  43.   fp = fopen(argv[1],"r+b");
  44.   char buf[BUFSIZ];
  45.   XML_Parser parser = XML_ParserCreate(NULL);
  46.   int done;
  47.   int depth = 0;
  48.   XML_SetUserData(parser, &depth);
  49.   XML_SetElementHandler(parser, startElement, endElement);
  50.   //必须添加这个回调函数才能正确取得元素的值
  51.   XML_SetCharacterDataHandler(parser,getData);
  52.   do {
  53.     size_t len = fread(buf, 1, sizeof(buf), fp);
  54.     done = len < sizeof(buf);
  55.     if (XML_Parse(parser, buf, len, done) == XML_STATUS_ERROR) {
  56.       fprintf(stderr,
  57.               "%s at line %d\n",
  58.               XML_ErrorString(XML_GetErrorCode(parser)),
  59.               XML_GetCurrentLineNumber(parser));
  60.       return 1;
  61.     }
  62.   } while (!done);
  63.   XML_ParserFree(parser);
  64.   return 0;
  65. }

复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表