ABAP Prog Tratar XML
Ejemplo extraído de la wiki de SAP
- REPORT kk.
- DATA: gcl_xml TYPE REF TO cl_xml_document.
- DATA: gv_filename TYPE string.
- DATA: gt_xml TYPE swxmlcont.
- DATA: gv_xml_string TYPE string.
- DATA: gv_size TYPE i.
- *&---------------------------------------------------------------------*
- *& start-of-selection
- *&---------------------------------------------------------------------*
- START-OF-SELECTION.
- CREATE OBJECT gcl_xml.
- gv_filename = 'c:\test.xml'.
- *Upload XML file
- CALL FUNCTION 'GUI_UPLOAD'
- EXPORTING
- filename = 't:\sample.xml'
- filetype = 'BIN'
- has_field_separator = ' '
- header_length = 0
- IMPORTING
- filelength = gv_size
- TABLES
- data_tab = gt_xml
- EXCEPTIONS
- OTHERS = 1.
- *Convert uploaded data to string
- CALL FUNCTION 'SCMS_BINARY_TO_STRING'
- EXPORTING
- input_length = gv_size
- IMPORTING
- text_buffer = gv_xml_string
- TABLES
- binary_tab = gt_xml
- EXCEPTIONS
- failed = 1
- OTHERS = 2.
- IF sy-subrc <> 0.
- MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
- WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
- ENDIF.
- *--[ Pasamos el string a XML
- CALL METHOD gcl_xml->parse_string
- EXPORTING
- stream = gv_xml_string.
- TYPES: BEGIN OF st_recep,
- filereference TYPE string,
- deliverynote TYPE string,
- END OF st_recep.
- DATA: g_t_recep TYPE STANDARD TABLE OF st_recep,
- g_s_recep TYPE st_recep.
- DATA: node_items TYPE REF TO if_ixml_node,
- node_item_name TYPE string,
- iterator_item TYPE REF TO if_ixml_node_iterator,
- iterator_invoiceline TYPE REF TO if_ixml_node_iterator,
- node_invoceline TYPE REF TO if_ixml_node,
- node_filereference TYPE REF TO if_ixml_node,
- node_deliverynote TYPE REF TO if_ixml_node,
- list_items TYPE REF TO if_ixml_node_list,
- list_invoiceline TYPE REF TO if_ixml_node_list,
- list_filereference TYPE REF TO if_ixml_node_list,
- list_deliverynotenumber TYPE REF TO if_ixml_node_list.
- node_items = gcl_xml->find_node( name = 'Items' ).
- list_items = node_items->get_children( ).
- iterator_item = list_items->create_iterator( ).
- REFRESH g_t_recep.
- WHILE node_items IS NOT INITIAL.
- node_item_name = node_items->get_name( ).
- IF node_item_name = 'InvoiceLine'.
- node_invoceline = node_items.
- list_invoiceline = node_invoceline->get_children( ).
- iterator_invoiceline = list_invoiceline->create_iterator( ).
- CLEAR g_s_recep.
- WHILE node_invoceline IS NOT INITIAL.
- node_item_name = node_invoceline->get_name( ).
- CASE node_item_name.
- WHEN 'FileReference'.
- *--[ Aquí tenemos el FileReference
- g_s_recep-filereference = node_invoceline->get_value( ).
- WHEN 'DeliveryNotesReferences'.
- node_deliverynote = gcl_xml->find_node( name = 'DeliveryNoteNumber'
- root = node_invoceline
- ).
- g_s_recep-deliverynote = node_deliverynote->get_value( ).
- ENDCASE.
- node_invoceline = iterator_invoiceline->get_next( ).
- ENDWHILE.
- IF NOT g_s_recep-deliverynote IS INITIAL OR
- NOT g_s_recep-filereference IS INITIAL.
- APPEND g_s_recep TO g_t_recep.
- ENDIF.
- ENDIF.
- node_items = iterator_item->get_next( ).
- ENDWHILE.
- BREAK-POINT.