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.