sap abap xml dom parser (tcmb kur verisini çekme)

merhaba, bu yazımda abap ile xml dosyasını nasıl parse edeceğimizi anlatacağım. öncelikle örnek olarak belirlediğimiz tcmb‘nin bize sağladığı today.xml dosyasını cl_http_client sınıfını kullanarak içeriğini string formatında çekeriz. daha sonra bu veriyi xstring formatına çevirip abap xml parser‘ın kullanımına hazır hale getiririz. if_ixml_parser arayüzünün parse metodunu kullanarak xml verimizin hiyerarşik yapısını çıkarmış oluruz. burada bir hata çıkarsa xml dosyası standartlara uygun değil demektir. bu adımdan sonra tek yapmamız gereken bize gerekli olan currency düğümlerini çekmek ve bu bilgileri ekrana yazmak. bunu düğüm iterasyonu ile yapabiliriz. aşağıdaki örnekte iterasyon bitene kadar verileri çekip bunları sırayla ekrana basıyorum.

 
REPORT  zfi_tcmb_kur.
 
DATA: lv_xml TYPE string,
      lv_url TYPE string.
 
DATA: lv_client TYPE REF TO if_http_client.
 
lv_url = 'http://www.tcmb.gov.tr/kurlar/today.xml'.
* Create client
CALL METHOD cl_http_client=>create_by_url
  EXPORTING
    url                = lv_url
  IMPORTING
    client             = lv_client
  EXCEPTIONS
    argument_not_found = 1
    plugin_not_active  = 2
    internal_error     = 3
    OTHERS             = 4.
IF sy-subrc NE 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
 
lv_client->request->set_header_field( name  = '~request_method'
                                        value = 'GET' ).
 
* Get request:
CALL METHOD lv_client->send
  EXCEPTIONS
    http_communication_failure = 1
    http_invalid_state         = 2
    http_processing_failed     = 3
    OTHERS                     = 4.
IF sy-subrc NE 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
 
* Prepare client-receive:
CALL METHOD lv_client->receive
  EXCEPTIONS
    http_communication_failure = 1
    http_invalid_state         = 2
    http_processing_failed     = 3
    OTHERS                     = 4.
 
* Get HTML:
lv_xml = lv_client->response->get_cdata( ).
 
break serkanozc.
DATA: l_ixml            TYPE REF TO if_ixml,
      l_streamfactory   TYPE REF TO if_ixml_stream_factory,
      l_istream         TYPE REF TO if_ixml_istream,
      l_parser          TYPE REF TO if_ixml_parser,
      l_document        TYPE REF TO if_ixml_document,
      lv_xml_x          TYPE xstring.
 
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
  EXPORTING
    text           = lv_xml
*   MIMETYPE       = ' '
*   ENCODING       =
 IMPORTING
   buffer         = lv_xml_x
 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.
 
 
* Creating the main iXML factory
l_ixml = cl_ixml=>create( ).
 
* Creating a stream factory
l_streamfactory = l_ixml->create_stream_factory( ).
 
* wrap the xstring containing the manifest file into an input stream
l_istream = l_streamfactory->create_istream_xstring( string = lv_xml_x ).
 
* Creating a document
l_document = l_ixml->create_document( ).
 
 
* Create a Parser
l_parser = l_ixml->create_parser( stream_factory = l_streamfactory
                                  istream        = l_istream
                                  document       = l_document ).
 
* Parse the stream
IF l_parser->parse( ) NE 0.
  MESSAGE 'today.xml parse problemi' TYPE 'E'.
  EXIT.
ENDIF.
 
DATA: curr_node_collection  TYPE REF TO if_ixml_node_collection,
      curr_node_iterator    TYPE REF TO if_ixml_node_iterator,
      curr_node             TYPE REF TO if_ixml_node,
      curr_nodemap          TYPE REF TO if_ixml_named_node_map,
      curr_attr             TYPE REF TO if_ixml_node,
      curr_node_list        TYPE REF TO if_ixml_node_list,
      lv_val                TYPE string,
      lv_length             TYPE i,
      lv_indx               TYPE i.
 
curr_node_collection = l_document->get_elements_by_tag_name( name = 'Currency' ).
curr_node_iterator = curr_node_collection->create_iterator( ).
curr_node = curr_node_iterator->get_next( ).
 
WHILE curr_node IS NOT INITIAL.
 
  curr_nodemap = curr_node->get_attributes( ).
  curr_attr = curr_nodemap->get_named_item( name = 'CurrencyCode' ).
 
  CLEAR lv_val.
  IF curr_attr IS NOT INITIAL.
    lv_val = curr_attr->get_value( ).
    WRITE 'CurrencyCode' COLOR COL_GROUP.
    WRITE: lv_val.
  ENDIF.
 
  curr_node_list = curr_node->get_children( ).
  CLEAR lv_length.
  lv_length = curr_node_list->get_length( ).
  DO lv_length TIMES.
    lv_indx = sy-index - 1.
    curr_attr = curr_node_list->get_item( lv_indx ).
 
    CLEAR lv_val.
    IF curr_attr IS NOT INITIAL.
      lv_val = curr_attr->get_name( ).
      WRITE: lv_val COLOR COL_GROUP.
      lv_val = curr_attr->get_value( ).
      WRITE: lv_val.
    ENDIF.
 
  ENDDO.
 
  curr_node = curr_node_iterator->get_next( ).
 
 
  WRITE: /.
ENDWHILE.

abap dom parser tcmb kur