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; }
/************************************************************************ * 函数名: 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中 }
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; }
/************************************************************************ * 函数名: 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; }
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; }