W Pub: ABAP Prog Tratar XML

Ejemplo extraído de la wiki de SAP

  1. REPORT kk.
  2.  
  3.  
  4. DATA: gcl_xml       TYPE REF TO cl_xml_document.
  5. DATA: gv_filename   TYPE string.
  6. DATA: gt_xml        TYPE swxmlcont.
  7. DATA: gv_xml_string TYPE string.
  8. DATA: gv_size       TYPE i.
  9. *&---------------------------------------------------------------------*
  10. *&      start-of-selection
  11. *&---------------------------------------------------------------------*
  12. START-OF-SELECTION.
  13.  
  14.   CREATE OBJECT gcl_xml.
  15.  
  16.   gv_filename = 'c:\test.xml'.
  17.  
  18. *Upload XML file
  19.   CALL FUNCTION 'GUI_UPLOAD'
  20.     EXPORTING
  21.       filename            = 't:\sample.xml'
  22.       filetype            = 'BIN'
  23.       has_field_separator = ' '
  24.       header_length       = 0
  25.     IMPORTING
  26.       filelength          = gv_size
  27.     TABLES
  28.       data_tab            = gt_xml
  29.     EXCEPTIONS
  30.       OTHERS              = 1.
  31.  
  32. *Convert uploaded data to string
  33.   CALL FUNCTION 'SCMS_BINARY_TO_STRING'
  34.     EXPORTING
  35.       input_length = gv_size
  36.     IMPORTING
  37.       text_buffer  = gv_xml_string
  38.     TABLES
  39.       binary_tab   = gt_xml
  40.     EXCEPTIONS
  41.       failed       = 1
  42.       OTHERS       = 2.
  43.   IF sy-subrc <> 0.
  44.     MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  45.             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  46.   ENDIF.
  47.  
  48. *--[ Pasamos el string a XML
  49.   CALL METHOD gcl_xml->parse_string
  50.     EXPORTING
  51.       stream = gv_xml_string.
  52.  
  53.  
  54.   TYPES: BEGIN OF st_recep,
  55.             filereference TYPE string,
  56.             deliverynote  TYPE string,
  57.          END OF st_recep.
  58.  
  59.   DATA: g_t_recep        TYPE STANDARD TABLE OF st_recep,
  60.         g_s_recep        TYPE st_recep.
  61.  
  62.   DATA: node_items              TYPE REF TO if_ixml_node,
  63.         node_item_name          TYPE string,
  64.         iterator_item           TYPE REF TO if_ixml_node_iterator,
  65.         iterator_invoiceline    TYPE REF TO if_ixml_node_iterator,
  66.  
  67.         node_invoceline         TYPE REF TO if_ixml_node,
  68.         node_filereference      TYPE REF TO if_ixml_node,
  69.         node_deliverynote       TYPE REF TO if_ixml_node,
  70.  
  71.         list_items              TYPE REF TO if_ixml_node_list,
  72.         list_invoiceline        TYPE REF TO if_ixml_node_list,
  73.         list_filereference      TYPE REF TO if_ixml_node_list,
  74.         list_deliverynotenumber TYPE REF TO if_ixml_node_list.
  75.  
  76.   node_items = gcl_xml->find_node( name = 'Items' ).
  77.   list_items = node_items->get_children( ).
  78.   iterator_item = list_items->create_iterator( ).
  79.   REFRESH g_t_recep.
  80.   WHILE node_items IS NOT INITIAL.
  81.     node_item_name = node_items->get_name( ).
  82.     IF node_item_name = 'InvoiceLine'.
  83.  
  84.       node_invoceline = node_items.
  85.       list_invoiceline = node_invoceline->get_children( ).
  86.       iterator_invoiceline = list_invoiceline->create_iterator( ).
  87.       CLEAR g_s_recep.
  88.       WHILE node_invoceline IS NOT INITIAL.
  89.  
  90.         node_item_name = node_invoceline->get_name( ).
  91.  
  92.         CASE node_item_name.
  93.           WHEN 'FileReference'.
  94. *--[ Aquí tenemos el FileReference
  95.             g_s_recep-filereference = node_invoceline->get_value( ).
  96.           WHEN 'DeliveryNotesReferences'.
  97.             node_deliverynote = gcl_xml->find_node( name = 'DeliveryNoteNumber'
  98.                                                     root = node_invoceline
  99.                                                    ).
  100.             g_s_recep-deliverynote = node_deliverynote->get_value( ).
  101.         ENDCASE.
  102.         node_invoceline = iterator_invoiceline->get_next( ).
  103.       ENDWHILE.
  104.       IF NOT g_s_recep-deliverynote IS INITIAL OR
  105.          NOT g_s_recep-filereference IS INITIAL.
  106.         APPEND g_s_recep TO g_t_recep.
  107.       ENDIF.
  108.     ENDIF.
  109.     node_items = iterator_item->get_next( ).
  110.   ENDWHILE.
  111.   BREAK-POINT.