Пример #1
0
my_bool
my_parse_charset_xml(MY_CHARSET_LOADER *loader, const char *buf, size_t len)
{
  MY_XML_PARSER p;
  struct my_cs_file_info info;
  my_bool rc;
  
  my_charset_file_init(&info);
  my_xml_parser_create(&p);
  my_xml_set_enter_handler(&p,cs_enter);
  my_xml_set_value_handler(&p,cs_value);
  my_xml_set_leave_handler(&p,cs_leave);
  info.loader= loader;
  my_xml_set_user_data(&p, (void *) &info);
  rc= (my_xml_parse(&p,buf,len) == MY_XML_OK) ? FALSE : TRUE;
  my_xml_parser_free(&p);
  my_charset_file_free(&info);
  if (rc != MY_XML_OK)
  {
    const char *errstr= my_xml_error_string(&p);
    if (sizeof(loader->error) > 32 + strlen(errstr))
    {
      /* We cannot use my_snprintf() here. See previous comment. */
      sprintf(loader->error, "at line %d pos %d: %s",
                my_xml_error_lineno(&p)+1,
                (int) my_xml_error_pos(&p),
                my_xml_error_string(&p));
    }
  }
  return rc;
}
Пример #2
0
/************************************************************************
* 函数名: findxml_string
* 作  者: sx
* 描  述: 将xml语句解析成struct中的内容
* 输入参数: char *xml_string,一段XML语句
*           find_str,将要搜索的关键词
* 输出参数: char *outbuf,最后返回的字符串
            如: xml中有:  BeginTime = "YYYY-MM-DD HH:MM:SS"
                find_str: BeginTime
            则: 返回值 0, outbuf中存放YYYY-MM-DD HH:MM:SS
* 返回值: 0表示成功,>0表示错误编号
************************************************************************/
int findxml_string( char *xml_string, int xml_len, char *find_str, char *outbuf )
{
    PARSER_FUN_PARAM pf;

    memset( &pf, 0, sizeof(PARSER_FUN_PARAM) );
    pf.easymode = 1;
    pf.outbuf = outbuf;
    strcpy( pf.easymode_findname, find_str );
    return my_xml_parse(&pf, xml_string, xml_len);            // 调用expat,将xml解析到pf中
}
Пример #3
0
my_bool my_parse_charset_xml(const char *buf, uint len, 
				    int (*add_collation)(CHARSET_INFO *cs))
{
  MY_XML_PARSER p;
  struct my_cs_file_info i;
  my_bool rc;
  
  my_xml_parser_create(&p);
  my_xml_set_enter_handler(&p,cs_enter);
  my_xml_set_value_handler(&p,cs_value);
  my_xml_set_leave_handler(&p,cs_leave);
  i.add_collation= add_collation;
  my_xml_set_user_data(&p,(void*)&i);
  rc= (my_xml_parse(&p,buf,len) == MY_XML_OK) ? FALSE : TRUE;
  my_xml_parser_free(&p);
  return rc;
}
Пример #4
0
/************************************************************************
* 函数名: xml2struct
* 作  者: sx
* 描  述: 将xml语句解析成struct中的内容
* 输入参数: char *xml_string,一段XML语句
*           char *outbuf,最后返回的结构体内部空间
*           int struct_index,主结构体在描述函数中的索引
*           __find_sub_strcut_desc fun,自定义的结构体描述函数
* 输出参数: 无
* 返回值: 0表示成功,>0表示错误编号
************************************************************************/
int xml2struct( char *xml_string, int xml_len, char *outbuf, int struct_index, __find_sub_strcut_desc fun )
{
    int fdcount;
    int ret_err;
    PARSER_FUN_PARAM pf;
    SAVE_XML_PARSE_DATA savept;

    FDARRAY_PTR * fdarrayptr;

    if ( xml_string == NULL || outbuf == NULL || fun == NULL )
    	{
			return -1;
    	}
        

    memset( &pf, 0, sizeof(PARSER_FUN_PARAM) );
    memset( &savept, 0, sizeof(SAVE_XML_PARSE_DATA) );

    pf.fun = (void *)fun;                           // 记住调用函数
    fdarrayptr = find_fdarray( &pf, struct_index, fun );
    if ( fdarrayptr != NULL && fdarrayptr->fdarray != NULL )
        fdcount = fdarrayptr->inputmsg.input_fdarray_count;
    else
    {
        free_pf( &pf );                       // 在find_fdarray()里有申请内存,这里要free
        free_fdarray( &pf );
        return XML_ERR_NO_FIND_DESC;        // 未找到结构体定义
    }

    savept.offset = 0;
    savept.fdarray = fdarrayptr->fdarray;
    savept.fdcount = fdcount;
    savept.in_fdarray_index = -1;
    pf.outbuf = outbuf;                        // 最后返回到此处
    pf.head = &savept;
    pf.current = pf.head;

    ret_err = my_xml_parse( &pf, xml_string, xml_len );         // 调用expat,将xml解析到pf中

    free_pf( &pf );
    free_fdarray( &pf );

    return ret_err;
}
Пример #5
0
int main(int ac, char **av)
{
  char str[1024*64]="";
  const char *fn;
  int  f;
  uint len;
  MY_XML_PARSER p;
  
  if (ac<2)
  {
    usage(av[0]);
    return 0;
  }
  
  fn=av[1]?av[1]:"test.xml";
  if ((f=open(fn,O_RDONLY))<0)
  {
    fprintf(stderr,"Err '%s'\n",fn);
    return 1;
  }
  
  len=read(f,str,sizeof(str)-1);
  str[len]='\0';
  
  my_xml_parser_create(&p);
  
  my_xml_set_enter_handler(&p,bstr);
  my_xml_set_value_handler(&p,dstr);
  my_xml_set_leave_handler(&p,estr);
  
  if (MY_XML_OK!=(f=my_xml_parse(&p,str,len)))
  {
    printf("ERROR at line %d pos %d '%s'\n",
      my_xml_error_lineno(&p)+1,
      my_xml_error_pos(&p),
      my_xml_error_string(&p));
  }
  
  my_xml_parser_free(&p);
  
  return 0;
}