Пример небольшого парсера для разбора xml вида:
1 2 3 4 5 6 7 |
<root> <ls fio="Ivanov Ivan" pernr="11112222"> <row param1="10" param2="20" param3="30" param4="40"/> <row param1="11" param2="21" param3="31" param4="41"/> <row param3="32" param4="42"/> </ls> </root> |
Накидал пример на коленке сильно не пинайте. В методах parse_data и get_child_node_data значения узлов находятся немного по разному, можно оставить тот способ который больше нравится.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 |
CLASS lcl_parse_xml DEFINITION. PUBLIC SECTION. METHODS: conctructor RETURNING VALUE(rv_me) TYPE REF TO lcl_parse_xml, main RETURNING VALUE(rv_me) TYPE REF TO lcl_parse_xml. PRIVATE SECTION. TYPES: BEGIN OF gty_s_parse_data, fio TYPE text255, pernr TYPE text255, param1 TYPE text255, param2 TYPE text255, param3 TYPE text255, param4 TYPE text255, END OF gty_s_parse_data. TYPES gty_t_parse_data TYPE TABLE OF gty_s_parse_data. DATA mt_file_data TYPE gty_t_parse_data. DATA mv_xml TYPE xstring. METHODS: parse_data, get_child_node_data IMPORTING io_xml_doc TYPE REF TO cl_xml_document io_node TYPE REF TO if_ixml_node is_file_data TYPE gty_s_parse_data CHANGING ct_file_data TYPE gty_t_parse_data, read_file . ENDCLASS. CLASS lcl_parse_xml IMPLEMENTATION. METHOD conctructor. rv_me = me. ENDMETHOD. METHOD main. read_file( ). parse_data( ). rv_me = me. ENDMETHOD. METHOD parse_data. DATA lo_xml_doc TYPE REF TO cl_xml_document. DATA lv_subrc TYPE sy-subrc. DATA lv_counter TYPE i. DATA lt_file_data LIKE mt_file_data. DATA ls_file_data LIKE LINE OF lt_file_data. CREATE OBJECT lo_xml_doc. CALL METHOD lo_xml_doc->parse_xstring EXPORTING stream = mv_xml RECEIVING retcode = lv_subrc. DATA(lo_node_one) = lo_xml_doc->find_node( name = 'root' ). "DATA(lv_child_num) = lo_node_one->num_children( ). DATA(lo_child_first_level) = lo_node_one->get_children( ). DATA(lo_itr) = lo_child_first_level->create_iterator( ). DATA(lo_child) = lo_itr->get_next( ). WHILE lo_child IS NOT INITIAL. CLEAR ls_file_data. lv_counter = 0. DO. CALL METHOD lo_xml_doc->get_node_attr EXPORTING node = lo_child index = lv_counter IMPORTING name = DATA(lv_name) value = DATA(lv_value). IF lv_name IS INITIAL. EXIT. ENDIF. ASSIGN COMPONENT lv_name OF STRUCTURE ls_file_data TO FIELD-SYMBOL(<lv_value>). IF sy-subrc = 0. <lv_value> = lv_value. ENDIF. ADD 1 TO lv_counter. ENDDO. get_child_node_data( EXPORTING io_xml_doc = lo_xml_doc io_node = lo_child is_file_data = ls_file_data CHANGING ct_file_data = lt_file_data ). lo_child = lo_itr->get_next( ). ENDWHILE. mt_file_data = lt_file_data. ENDMETHOD. METHOD get_child_node_data. DATA(lv_child_num) = io_node->num_children( ). DATA(lo_child_second_level) = io_node->get_children( ). DATA(lo_itr) = lo_child_second_level->create_iterator( ). DATA(lo_child) = lo_itr->get_next( ). DATA lv_counter TYPE i. DATA ls_file_data LIKE is_file_data. DATA lv_subrc TYPE sy-subrc. WHILE lo_child IS NOT INITIAL. ls_file_data = is_file_data. CLEAR lv_subrc. lv_counter = 0. DO. DATA(lo_attributes) = lo_child->get_attributes( ). IF lo_attributes IS INITIAL. lv_subrc = 1. EXIT. ENDIF. DATA(lo_attribute) = lo_attributes->get_item( lv_counter ). IF lo_attribute IS INITIAL. EXIT. ENDIF. DATA(lv_name) = lo_attribute->get_name( ). DATA(lv_value) = lo_attribute->get_value( ). ASSIGN COMPONENT lv_name OF STRUCTURE ls_file_data TO FIELD-SYMBOL(<lv_value>). IF sy-subrc = 0. <lv_value> = lv_value. ENDIF. ADD 1 TO lv_counter. ENDDO. IF lv_subrc IS INITIAL. APPEND ls_file_data TO ct_file_data. ENDIF. lo_child = lo_itr->get_next( ). ENDWHILE. ENDMETHOD. METHOD read_file. "Чтение файла нагло скопипастил в стандарте. DATA: lt_filetable TYPE filetable, lv_user_action TYPE i, lv_files TYPE i, lv_file_length TYPE i, ls_transport TYPE /iwbep/sutil_transport, lt_transport TYPE /iwbep/sutil_transport_t. cl_gui_frontend_services=>file_open_dialog( EXPORTING file_filter = cl_gui_frontend_services=>filetype_xml CHANGING file_table = lt_filetable user_action = lv_user_action rc = lv_files EXCEPTIONS OTHERS = 1 ). IF sy-subrc <> 0 OR lv_files <> 1 OR lv_user_action = cl_gui_frontend_services=>action_cancel. "Ошибка EXIT. ENDIF. READ TABLE lt_filetable INDEX 1 INTO DATA(lv_filename). cl_gui_frontend_services=>gui_upload( EXPORTING filename = CONV #( lv_filename ) filetype = 'BIN' IMPORTING filelength = lv_file_length CHANGING data_tab = lt_transport[] EXCEPTIONS OTHERS = 1 ). LOOP AT lt_transport INTO ls_transport. CONCATENATE mv_xml ls_transport-chunk INTO mv_xml IN BYTE MODE. ENDLOOP. ENDMETHOD. ENDCLASS. |
Вызов:
1 2 3 4 |
REPORT z_test. START-OF-SELECTION. DATA(lo_data) = NEW lcl_parse_xml( )->main( ). |