Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

XML in String to Internal table

former_member269988
Participant
0 Likes
8,199

Hi dear,

please i need a help of us.

I need convert XML (in string) to internal table, this code is perfect becaus de structure XML is dynamically, buuut i don 't know how i change file to XML string:

********************* CODE *************************************

CREATE OBJECT lcl_xml_doc.

*&--CONVERSION OF XML TO ITAB PROCESS--&*

   CALL METHOD lcl_xml_doc->import_from_file

     EXPORTING

       filename = p_filnam

     RECEIVING

       retcode  = v_subrc.

*  CHECK v_subrc = 0.

   v_node = lcl_xml_doc->m_document.

   CHECK NOT v_node IS INITIAL.

   v_iterator = v_node->create_iterator( ).

   v_node = v_iterator->get_next( ).

   WHILE NOT v_node IS INITIAL.

     CASE v_node->get_type( ).

       WHEN if_ixml_node=>co_node_element.

         v_name = v_node->get_name( ).

         v_nodemap = v_node->get_attributes( ).

         IF NOT v_nodemap IS INITIAL.

* attributes

           v_count = v_nodemap->get_length( ).

           DO v_count TIMES.

             v_index = sy-index - 1.

             v_attr = v_nodemap->get_item( v_index ).

             v_name = v_attr->get_name( ).

             v_prefix = v_attr->get_namespace_prefix( ).

             v_value = v_attr->get_value( ).

           ENDDO.

         ENDIF.

       WHEN if_ixml_node=>co_node_text OR

        if_ixml_node=>co_node_cdata_section.

* text node

         v_value = v_node->get_value( ).

         MOVE v_value TO v_char.

         IF v_char <> cl_abap_char_utilities=>cr_lf.

           wa-name  = v_name.

           wa-value = v_value.

           APPEND wa TO itab.

           CLEAR  wa.

         ENDIF.

     ENDCASE.

* advance to next node

     v_node = v_iterator->get_next( ).

   ENDWHILE.

*&-- WRITING ITAB FILES IN OUTPUT--&*

   LOOP AT itab INTO wa.

     WRITE :/1 wa-name,20 wa-value.

   ENDLOOP.

********************* CODE *************************************

Does anyone have any ideas?

1 ACCEPTED SOLUTION
Read only

Former Member
4,750

Hi, Maby you can try it:

TYPE-POOLS: SLIS,ABAP.

include <symbol>.

DATA : lcl_xml_doc   TYPE REF TO CL_XML_DOCUMENT,

       v_subrc LIKE sy-subrc,

       p_filnam TYPE LOCALFILE value 'H:\tmp\ACER 3C3-20130909001-20130918-084215.xml'.

DATA:    v_node          TYPE REF TO if_ixml_node,

         v_child_node    TYPE REF TO if_ixml_node,

         v_root          TYPE REF TO if_ixml_node,

         v_iterator      TYPE REF TO if_ixml_node_iterator,

         v_nodemap       TYPE REF TO if_ixml_named_node_map,

         v_count         TYPE i, v_index TYPE i,

         v_attr          TYPE REF TO if_ixml_node,

         v_name          TYPE string,

         v_prefix        TYPE string,

         v_value         TYPE string,

         v_char          TYPE char2,

         V_PTEXT         TYPE REF TO IF_IXML_TEXT,

         v_node_info    TYPE string,

         retval         TYPE REF TO IF_IXML_NODE_FILTER,

         filter2  type ref to if_ixml_node_filter,

         pdocument type ref to if_ixml_document.

   TYPES: BEGIN OF ty_tab,

                   caminho type string,

                   name type LVC_FNAME,  " TYPE string,

                   value TYPE string,

   END OF ty_tab.

   DATA: itab   TYPE STANDARD TABLE OF ty_tab,

         wa     TYPE ty_tab.

   DATA: BEGIN OF field_name OCCURS 0,

         name type LVC_FNAME,

         END OF field_name.

   DATA: l_count TYPE I.

CREATE OBJECT lcl_xml_doc.

*&--CONVERSION OF XML TO ITAB PROCESS--&*

   CALL METHOD lcl_xml_doc->import_from_file

     EXPORTING

       filename = p_filnam

     RECEIVING

       retcode  = v_subrc.

*  CHECK v_subrc = 0.

   v_node = lcl_xml_doc->m_document.

   CHECK NOT v_node IS INITIAL.

   v_iterator = v_node->create_iterator( ).

   v_node = v_iterator->get_next( ).

   WHILE NOT v_node IS INITIAL.

     CASE v_node->get_type( ).

       WHEN if_ixml_node=>co_node_element.

         v_name = v_node->get_name( ).

         v_nodemap = v_node->get_attributes( ).

         IF NOT v_nodemap IS INITIAL.

* attributes

           v_count = v_nodemap->get_length( ).

           DO v_count TIMES.

             v_index = sy-index - 1.

             v_attr = v_nodemap->get_item( v_index ).

             v_name = v_attr->get_name( ).

             v_prefix = v_attr->get_namespace_prefix( ).

             v_value = v_attr->get_value( ).

           ENDDO.

         ENDIF.

       WHEN if_ixml_node=>co_node_text OR

        if_ixml_node=>co_node_cdata_section.

* text node

         v_value = v_node->get_value( ).

         MOVE v_value TO v_char.

         IF v_char <> cl_abap_char_utilities=>cr_lf.

           wa-name  = v_name.

           wa-value = v_value.

           APPEND wa TO itab.

           CLEAR  wa.

**get field name

           READ TABLE field_name WITH KEY name = v_name.

           IF sy-subrc <> 0.

             field_name-name = v_name.

             APPEND field_name. CLEAR field_name.

             l_count = l_count + 1.

           ENDIF.

         ENDIF.

     ENDCASE.

* advance to next node

     v_node = v_iterator->get_next( ).

   ENDWHILE.

*&-- WRITING ITAB FILES IN OUTPUT--&*

*   LOOP AT itab INTO wa.

*     WRITE :/1 wa-name,20 wa-value.

*   ENDLOOP.

**convert to inintal table

  DATA: dy_table TYPE REF TO data,

        dy_line  TYPE REF TO data,

        it_structure TYPE lvc_t_fcat,

        wa_structure TYPE lvc_s_fcat.

  FIELD-SYMBOLS:<dyn_table> TYPE STANDARD TABLE,

  <dyn_wa> TYPE ANY,

  <dyn_field> TYPE ANY.

  DATA:wa_new_line TYPE REF TO data.

  DATA:l_pos TYPE i VALUE '1'.

  DATA: w_loop LIKE sy-tabix.

  DATA: l_mod  TYPE I.

  LOOP AT field_name.

    l_pos = l_pos + 1.

    wa_structure-fieldname = field_name-name.

    wa_structure-col_pos = 1.

    APPEND wa_structure TO it_structure.

  ENDLOOP.

  CALL METHOD cl_alv_table_create=>create_dynamic_table

    EXPORTING

      it_fieldcatalog = it_structure

    IMPORTING

      ep_table        = dy_table.

  ASSIGN dy_table->* TO <dyn_table>.

  CREATE DATA wa_new_line LIKE LINE OF <dyn_table>.

  ASSIGN wa_new_line->* TO <dyn_wa>.

  LOOP AT itab INTO wa.

    w_loop = sy-tabix.

    LOOP AT it_structure INTO wa_structure.

      IF wa_structure-fieldname = wa-name.

        ASSIGN COMPONENT wa_structure-fieldname OF STRUCTURE <dyn_wa> TO <dyn_field>.

        <dyn_field> = wa-value.

      ENDIF.

    ENDLOOP.

    l_mod = w_loop MOD l_count.

    IF l_mod = 0.

      APPEND <dyn_wa> TO <dyn_table>.

      CLEAR <dyn_wa>.

    ENDIF.

  ENDLOOP.

XML Like this:

Result as follow:

8 REPLIES 8
Read only

Former Member
4,751

Hi, Maby you can try it:

TYPE-POOLS: SLIS,ABAP.

include <symbol>.

DATA : lcl_xml_doc   TYPE REF TO CL_XML_DOCUMENT,

       v_subrc LIKE sy-subrc,

       p_filnam TYPE LOCALFILE value 'H:\tmp\ACER 3C3-20130909001-20130918-084215.xml'.

DATA:    v_node          TYPE REF TO if_ixml_node,

         v_child_node    TYPE REF TO if_ixml_node,

         v_root          TYPE REF TO if_ixml_node,

         v_iterator      TYPE REF TO if_ixml_node_iterator,

         v_nodemap       TYPE REF TO if_ixml_named_node_map,

         v_count         TYPE i, v_index TYPE i,

         v_attr          TYPE REF TO if_ixml_node,

         v_name          TYPE string,

         v_prefix        TYPE string,

         v_value         TYPE string,

         v_char          TYPE char2,

         V_PTEXT         TYPE REF TO IF_IXML_TEXT,

         v_node_info    TYPE string,

         retval         TYPE REF TO IF_IXML_NODE_FILTER,

         filter2  type ref to if_ixml_node_filter,

         pdocument type ref to if_ixml_document.

   TYPES: BEGIN OF ty_tab,

                   caminho type string,

                   name type LVC_FNAME,  " TYPE string,

                   value TYPE string,

   END OF ty_tab.

   DATA: itab   TYPE STANDARD TABLE OF ty_tab,

         wa     TYPE ty_tab.

   DATA: BEGIN OF field_name OCCURS 0,

         name type LVC_FNAME,

         END OF field_name.

   DATA: l_count TYPE I.

CREATE OBJECT lcl_xml_doc.

*&--CONVERSION OF XML TO ITAB PROCESS--&*

   CALL METHOD lcl_xml_doc->import_from_file

     EXPORTING

       filename = p_filnam

     RECEIVING

       retcode  = v_subrc.

*  CHECK v_subrc = 0.

   v_node = lcl_xml_doc->m_document.

   CHECK NOT v_node IS INITIAL.

   v_iterator = v_node->create_iterator( ).

   v_node = v_iterator->get_next( ).

   WHILE NOT v_node IS INITIAL.

     CASE v_node->get_type( ).

       WHEN if_ixml_node=>co_node_element.

         v_name = v_node->get_name( ).

         v_nodemap = v_node->get_attributes( ).

         IF NOT v_nodemap IS INITIAL.

* attributes

           v_count = v_nodemap->get_length( ).

           DO v_count TIMES.

             v_index = sy-index - 1.

             v_attr = v_nodemap->get_item( v_index ).

             v_name = v_attr->get_name( ).

             v_prefix = v_attr->get_namespace_prefix( ).

             v_value = v_attr->get_value( ).

           ENDDO.

         ENDIF.

       WHEN if_ixml_node=>co_node_text OR

        if_ixml_node=>co_node_cdata_section.

* text node

         v_value = v_node->get_value( ).

         MOVE v_value TO v_char.

         IF v_char <> cl_abap_char_utilities=>cr_lf.

           wa-name  = v_name.

           wa-value = v_value.

           APPEND wa TO itab.

           CLEAR  wa.

**get field name

           READ TABLE field_name WITH KEY name = v_name.

           IF sy-subrc <> 0.

             field_name-name = v_name.

             APPEND field_name. CLEAR field_name.

             l_count = l_count + 1.

           ENDIF.

         ENDIF.

     ENDCASE.

* advance to next node

     v_node = v_iterator->get_next( ).

   ENDWHILE.

*&-- WRITING ITAB FILES IN OUTPUT--&*

*   LOOP AT itab INTO wa.

*     WRITE :/1 wa-name,20 wa-value.

*   ENDLOOP.

**convert to inintal table

  DATA: dy_table TYPE REF TO data,

        dy_line  TYPE REF TO data,

        it_structure TYPE lvc_t_fcat,

        wa_structure TYPE lvc_s_fcat.

  FIELD-SYMBOLS:<dyn_table> TYPE STANDARD TABLE,

  <dyn_wa> TYPE ANY,

  <dyn_field> TYPE ANY.

  DATA:wa_new_line TYPE REF TO data.

  DATA:l_pos TYPE i VALUE '1'.

  DATA: w_loop LIKE sy-tabix.

  DATA: l_mod  TYPE I.

  LOOP AT field_name.

    l_pos = l_pos + 1.

    wa_structure-fieldname = field_name-name.

    wa_structure-col_pos = 1.

    APPEND wa_structure TO it_structure.

  ENDLOOP.

  CALL METHOD cl_alv_table_create=>create_dynamic_table

    EXPORTING

      it_fieldcatalog = it_structure

    IMPORTING

      ep_table        = dy_table.

  ASSIGN dy_table->* TO <dyn_table>.

  CREATE DATA wa_new_line LIKE LINE OF <dyn_table>.

  ASSIGN wa_new_line->* TO <dyn_wa>.

  LOOP AT itab INTO wa.

    w_loop = sy-tabix.

    LOOP AT it_structure INTO wa_structure.

      IF wa_structure-fieldname = wa-name.

        ASSIGN COMPONENT wa_structure-fieldname OF STRUCTURE <dyn_wa> TO <dyn_field>.

        <dyn_field> = wa-value.

      ENDIF.

    ENDLOOP.

    l_mod = w_loop MOD l_count.

    IF l_mod = 0.

      APPEND <dyn_wa> TO <dyn_table>.

      CLEAR <dyn_wa>.

    ENDIF.

  ENDLOOP.

XML Like this:

Result as follow:

Read only

0 Likes
4,749

Hi Spring Long ,

Thanks for your help....i change the code but partly it worked, I realized that in the string reading the next node is losing part of XML in your code you had this problem?

Read only

0 Likes
4,749

Hello Wilson Matsuoka:  Can you posted your  XML file screenshot ? Maybe i can adjust the code so that solve your problem.

Read only

0 Likes
4,749

Hi Spring,

my xml dynamically, but in this case is:

<?xml version="1.0" encoding="utf-8"?>#<eSocial xmlns:es="http://www.esocial.gov.br/schema/evt">

  <evtMonit>

  <Id>ID1103944220001422016081619062200002</Id>

  <ideEvento>   

  <indRetif>1</indRetif>

  <nrRecibo />  

  <tpAmb>3</tpAmb>   

  <procEmi>1</procEmi>   

  <verProc>7.0</verProc> 

  </ideEvento>  

  <ideEmpregador>  

  <tpInscricao>1</tpInscricao>

  <nrInscr>10394422000142</nrInscr>

  </ideEmpregador>

  <ideVinculo>    

  <cpfTrab>010.509.196-02</cpfTrab>

  <nisTrab>2222222222</nisTrab> 

  <matricula>37100974</matricula>

  </ideVinculo>

  <aso>#

  <dtAso>2015-09-03</dtAso>

  <tpAso>1</tpAso>    

  <resAso>1</resAso> 

  <exame />   

  <monitBiolog>#

<respMonit>     

   <nrConsClasse>119151</nrConsClasse>

   <ufConsClasse>SP</ufConsClasse> 

   </respMonit>  

   </monitBiolog> 

   <ideServSaude>   

   <frmCtt>AV XXXXX, 333 XXXX - XXXXXX - SP Cep:33333  222 22222222</frmCtt>

   <medico>       

   <nmMed>ROBERTO NETO</nmMed>  

   <crm>         

   <nrCRM>119151</nrCRM> 

   <ufCRM>SP</ufCRM>   

   </crm>     

   </medico>

   </ideServSaude>

   </aso>

   </evtMonit>#</eSocial>#<eSocial xmlns:es="http://www.esocial.gov.br/schema/evt">

   <evtMonit>  

   <Id>ID1103944220001422016081619062100001</Id>

   <ideEvento>   

   <indRetif>1</indRetif>  

   <nrRecibo />    

   <tpAmb>3</tpAmb>  

   <procEmi>1</procEmi>

   <verProc>7.0</verProc>

   </ideEvento> 

   <ideEmpregador>

   <tpInscricao>1</tpInscricao>#

    </monitBiolog>  

  <ideServSaude>  

    <frmCtt>XXXXX, 777XXX - XXXX - SP Cep: 1111111  19 22222 </frmCtt>     

  <medico>     

  <nmMed>Eleonor aberto</nmMed>

  <crm>       

  <nrCRM>111111</n

  </medico>  

  </ideServSaude>

  </aso>

Just remember, this code is load in string ( <![CDATA[<?xml ......)

thanks a lot

Read only

0 Likes
4,749

Hello Wilson: It seem that your xml file structure field is single (My test xml field is duplicate). Please try modify code like this:

1.   code:

* text node

         v_value = v_node->get_value( ).

         MOVE v_value TO v_char.

         IF v_char <> cl_abap_char_utilities=>cr_lf.

           TRANSLATE v_name TO UPPER CASE.   "add new line code

           wa-name  = v_name.

           wa-value = v_value.

           APPEND wa TO itab.

           CLEAR  wa.

**get field name

           READ TABLE field_name WITH KEY name = v_name.

           IF sy-subrc <> 0.

             field_name-name = v_name.

             APPEND field_name. CLEAR field_name.

*            l_count = l_count + 1.                                "mark the line

           ENDIF.

         ENDIF.

2.  code:

*    l_mod = w_loop MOD l_count.  "delete the line

*    IF l_mod = 0. "delete the line

    AT LAST.        "add new line

      APPEND <dyn_wa> TO <dyn_table>.

      CLEAR <dyn_wa>.

    ENDAT.           "add new line

*    ENDIF. "delete the line

Read only

0 Likes
4,749

Thanks Spring, it's done

Read only

prajeshdesai
Contributor
0 Likes
4,749

There are no. of threads raised on this topic. i found below tutorial is very useful and productive.

Reference Link: Tutorial: Data exchange between ABAP and XML

Hope this helps.

Read only

retired_member
Product and Topic Expert
Product and Topic Expert
4,749

Personally, I would use the sXML library for such a task, because in my opinion it is simpler to use compared to iXML. See a parsing example, maybe you can adjust it to your needs.

Another "simple" way can be to write a Simple Transformation that fits your XML data using the tt:loop statement that directly deserializes into an internal table.

Horst