Parse raw XML SYNOPSYS RETURN Currently pointer to parsed XML on success 0 on parse error */
| 2736 | 0 on parse error |
| 2737 | */ |
| 2738 | String *Item_xml_str_func::parse_xml(String *raw_xml, String *parsed_xml_buf) |
| 2739 | { |
| 2740 | MY_XML_PARSER p; |
| 2741 | MY_XML_USER_DATA user_data; |
| 2742 | int rc; |
| 2743 | |
| 2744 | parsed_xml_buf->length(0); |
| 2745 | |
| 2746 | /* Prepare XML parser */ |
| 2747 | my_xml_parser_create(&p); |
| 2748 | p.flags= MY_XML_FLAG_RELATIVE_NAMES | MY_XML_FLAG_SKIP_TEXT_NORMALIZATION; |
| 2749 | user_data.level= 0; |
| 2750 | user_data.pxml= parsed_xml_buf; |
| 2751 | user_data.parent= 0; |
| 2752 | my_xml_set_enter_handler(&p, xml_enter); |
| 2753 | my_xml_set_value_handler(&p, xml_value); |
| 2754 | my_xml_set_leave_handler(&p, xml_leave); |
| 2755 | my_xml_set_user_data(&p, (void*) &user_data); |
| 2756 | |
| 2757 | /* Add root node */ |
| 2758 | p.current_node_type= MY_XML_NODE_TAG; |
| 2759 | xml_enter(&p, raw_xml->ptr(), 0); |
| 2760 | |
| 2761 | /* Execute XML parser */ |
| 2762 | if ((rc= my_xml_parse(&p, raw_xml->ptr(), raw_xml->length())) != MY_XML_OK) |
| 2763 | { |
| 2764 | char buf[128]; |
| 2765 | my_snprintf(buf, sizeof(buf)-1, "parse error at line %d pos %lu: %s", |
| 2766 | my_xml_error_lineno(&p) + 1, |
| 2767 | (ulong) my_xml_error_pos(&p) + 1, |
| 2768 | my_xml_error_string(&p)); |
| 2769 | push_warning_printf(current_thd, Sql_condition::WARN_LEVEL_WARN, |
| 2770 | ER_WRONG_VALUE, |
| 2771 | ER(ER_WRONG_VALUE), "XML", buf); |
| 2772 | } |
| 2773 | my_xml_parser_free(&p); |
| 2774 | |
| 2775 | return rc == MY_XML_OK ? parsed_xml_buf : 0; |
| 2776 | } |
| 2777 | |
| 2778 | |
| 2779 | String *Item_func_xml_extractvalue::val_str(String *str) |
nothing calls this directly
no test coverage detected