merhaba bu yazımda, elimizdeki bir xml string içerisinden belli bir tag arasındaki verileri nasıl çekeceğimizi anlatacağım. bunu yaparken sap’nin regular expression sınıflarını kullanacağım. abap regular expression için bize iki adet sınıf gerekiyor; cl_abap_regex ve cl_abap_matcher.
aşağıda verdiğim örnekte ben test tag’ini kullandım. öncelikte test tagleri arasındaki veriyi çekmek için regular expression deyimimi belirledim; ‘<test>((?:(?!<?test>).)*)</test>‘. daha sonra da elimdeki xml string ile cl_abap_matcher sınıfından nesne üretip xml string içerisindeki aradığım verileri bir döngü ile çektim.
sonuç olarak sırasıyla group1 ve group2 değerlerini elde ettim.
buyrun kodlarımız burada;
REPORT zregex. DATA: lr_regex TYPE REF TO cl_abap_regex, lr_matcher TYPE REF TO cl_abap_matcher, lv_smatch TYPE string, lv_success TYPE abap_bool, lr_exc_regex TYPE REF TO cx_sy_regex, lr_exc_matcher TYPE REF TO cx_sy_matcher, lv_exc_text TYPE string. TRY. CREATE OBJECT lr_regex EXPORTING pattern = '<test>((?:(?!<?test>).)*)</test>' ignore_case = abap_true simple_regex = abap_false no_submatches = abap_false. CREATE OBJECT lr_matcher EXPORTING regex = lr_regex text = '<abc>33</abc><test>group1</test><x>x</x><test>group2</test><qwe>666</qwe>' * table = . DO. CALL METHOD lr_matcher->find_next RECEIVING success = lv_success. IF lv_success EQ 'X'. CALL METHOD lr_matcher->get_submatch EXPORTING index = 1 RECEIVING submatch = lv_smatch. MESSAGE lv_smatch TYPE 'I'. ELSE. EXIT. ENDIF. ENDDO. CATCH cx_sy_regex INTO lr_exc_regex. lv_exc_text = lr_exc_regex->get_text( ). MESSAGE lv_exc_text TYPE 'I'. CATCH cx_sy_matcher INTO lr_exc_matcher. lv_exc_text = lr_exc_matcher->get_text( ). MESSAGE lv_exc_text TYPE 'I'. ENDTRY. |