sap abap xml string içerisinden regex ile veri ayıklamak (abap extract string)

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.