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