Добрый день..в свое время написал xml парсер..может поможет. FUNCTION Z_PARSER_X600. *"---------------------------------------------------------------------- *"*"Локальный интерфейс: *" IMPORTING *" REFERENCE(XML_DATA) TYPE STRING *" EXPORTING *" REFERENCE(RESPONCE) TYPE ZSTR_COLVIR_RESP *"---------------------------------------------------------------------- TABLES: ZX600, ZTBPNS. DATA: xml_xstr TYPE xstring, istream TYPE REF TO if_ixml_istream. * DATA: * wa TYPE STRING. DATA: g_ixml TYPE REF TO if_ixml. DATA: streamFactory TYPE REF TO if_ixml_stream_factory. DATA: parser TYPE REF TO if_ixml_parser. DATA: document TYPE REF TO if_ixml_document. DATA tb_x600 TYPE TABLE OF ZX600. DATA: lk_x600 LIKE ZX600, refer0 type zx600-refer. DATA: lk_ztbpns LIKE ZTBPNS. DATA: nq type i.
CALL FUNCTION 'SCMS_STRING_TO_XSTRING' EXPORTING text = xml_data IMPORTING buffer = xml_xstr. IF xml_xstr is not initial. g_ixml = cl_ixml=>create( ). streamFactory = g_ixml->create_stream_factory( ).
istream = streamFactory->create_istream_xstring( STRING = xml_xstr ). document = g_ixml->create_document( ). parser = g_ixml->create_parser( stream_factory = streamFactory istream = iStream document = document ).
IF parser->parse( ) NE 0. IF parser->num_errors( ) NE 0. DATA: parseError TYPE REF TO if_ixml_parse_error, str TYPE string, i TYPE i, count TYPE i, index TYPE i. count = parser->num_errors( ). * WRITE: count, ' parse errors have occured:'. index = 0. WHILE index < count. parseError = parser->get_error( index = index ). i = parseError->get_line( ). * WRITE: 'line: ', i. i = parseError->get_column( ). * WRITE: 'column: ', i. str = parseError->get_reason( ). * если ошибка в самом документе responce-zmess = str. responce-zstat = '1'. * LEAVE PROGRAM. INDEX = INDEX + 1. ENDWHILE. ENDIF.
ENDIF.
DATA: t_str TYPE string. DATA: element TYPE REF TO if_ixml_element. DATA: child TYPE REF TO if_ixml_node. DATA: children TYPE REF TO if_ixml_node_list, child_iterator TYPE REF TO if_ixml_node_iterator. DATA: attributes TYPE REF TO if_ixml_named_node_map, attribute TYPE REF TO if_ixml_attribute. * парсим XML element = document->get_root_element( ).
child = element->get_parent( ).
child_iterator = element->create_iterator( ). nq = 0. WHILE NOT child IS INITIAL. t_str = child->get_name( ). WRITE / t_str. DATA: lr_nodeiterator TYPE REF TO if_ixml_node_iterator, lr_attributenode TYPE REF TO if_ixml_node. DATA: lc_name TYPE string, lc_value TYPE string. DATA: flag(1). attributes = child->get_attributes( ). IF NOT attributes IS INITIAL. lr_nodeiterator = attributes->create_iterator( ). lr_attributenode = lr_nodeiterator->get_next( ).
WHILE lr_attributenode IS NOT INITIAL. lc_name = lr_attributenode->get_name( ). lc_value = lr_attributenode->get_value( ). lr_attributenode = lr_nodeiterator->get_next( ). * WRITE: / lc_name, '=', lc_value.
CASE lc_name. ..... забираем данные по тегам ENDCASE. ENDWHILE. ENDIF. child = child_iterator->get_next( ). ENDWHILE.
|
|