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. |