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: 

Parse XML into Internal table from a string (no file upload)

GaryK
Explorer
0 Kudos
354

Hi Folks,

I'm playing around with XML and just looking for an example of parsing an XML payload which is contained in a string variable to an internal table. I've looked up lots of examples and they all upload an XML file which is not what I have. I'm receiving the XML as a string from another system. I need to parse to an internal table, aggregrate and send back as XML.  Trying to use various things including Call Transformation but I think I'm missing a step or something.

Any help is great appreciated. Thanks for your time.

Thanks

Gary

1 ACCEPTED SOLUTION

rosenberg_eitan
Active Contributor
0 Kudos
246

Hi,

Try to use cl_ixml .

Convert the string to xstring

CALL METHOD cl_bcs_convert=>string_to_xstring

And here is a sample using cl_ixml .

TYPES: BEGIN OF tp_alv_data_1 .
TYPES: date        TYPE char32 ,
        name        TYPE char32 ,
        currency    TYPE char32 ,
        country     TYPE char32 ,
        rate        TYPE char32 ,
        ukurs       TYPE tcurr-ukurs ,
        change      TYPE char32 .
TYPES: END OF tp_alv_data_1 .
*
TYPES: tp_alv_data_1_tab TYPE STANDARD TABLE OF tp_alv_data_1  .

FORM do_xml_parse_1

  USING

    xml_string TYPE xstring

  CHANGING

    it_alv_data_1 TYPE tp_alv_data_1_tab .

  IF xml_string IS INITIAL .

    RETURN .

  ENDIF .

  DATA: st_alv_data_1 LIKE LINE OF it_alv_data_1 .

  g_ixml = cl_ixml=>create( ).

  DATA: streamfactory TYPE REF TO if_ixml_stream_factory.

  streamfactory = g_ixml->create_stream_factory( ).

  DATA: istream TYPE REF TO if_ixml_istream.

  istream  = streamfactory->create_istream_xstring( string = xml_string ).

  DATA: document TYPE REF TO if_ixml_document.

  document = g_ixml->create_document( ) .

  DATA: parser TYPE REF TO if_ixml_parser.

  parser = g_ixml->create_parser( stream_factory = streamfactory

                                  istream        = istream

                                  document       = document ).

  parser->parse( ).

*------------------------------

  DATA: date  TYPE string .

  DATA: name  TYPE string .

  DATA: value TYPE string .

*------------------------------

  DATA: nodes_x TYPE REF TO if_ixml_node_collection .

  DATA: node_x  TYPE REF TO if_ixml_node .

  nodes_x = document->get_elements_by_tag_name( name = 'LAST_UPDATE' ).

  node_x = nodes_x->get_item( 0 ) .

  name  = node_x->get_name( ) .

  date  = node_x->get_value( ) .

  st_alv_data_1-date = node_x->get_value( ) .

*------------------------------

  DATA: length_0 TYPE i .

  DATA: nodes_0 TYPE REF TO if_ixml_node_collection.

  DATA: node_0  TYPE REF TO if_ixml_node .

  DATA: length_1 TYPE i .

  DATA: nodes_1 TYPE REF TO if_ixml_node_list .

  DATA: node_1  TYPE REF TO if_ixml_node .

  nodes_0 = document->get_elements_by_tag_name( name = 'CURRENCY' ).

  length_0 = nodes_0->get_length( ) .

  DATA: index TYPE i .

  DO length_0 TIMES .

    index = sy-index - 1 .

    node_0 = nodes_0->get_item( index ) .

    name  = node_0->get_name( ) .

    value = space .

    nodes_1 = node_0->get_children( ) .

    length_1 = nodes_1->get_length( ).

    DO length_1 TIMES .

      index = sy-index - 1 .

      node_1 = nodes_1->get_item( index ).

      name  = node_1->get_name( ) .

      value = node_1->get_value( ) .

      CASE name .

        WHEN 'NAME' .

          st_alv_data_1-name = value .

        WHEN 'CURRENCYCODE' .

          st_alv_data_1-currency = value .

        WHEN 'COUNTRY' .

          st_alv_data_1-country = value .

        WHEN 'RATE' .

          st_alv_data_1-rate  = value .

          st_alv_data_1-ukurs = value .

        WHEN 'CHANGE' .

          st_alv_data_1-change = value .

      ENDCASE .

    ENDDO .

    APPEND st_alv_data_1 TO it_alv_data_1 .

  ENDDO .

ENDFORM .                    "do_xml_parse_1

Regards.

2 REPLIES 2

rosenberg_eitan
Active Contributor
0 Kudos
247

Hi,

Try to use cl_ixml .

Convert the string to xstring

CALL METHOD cl_bcs_convert=>string_to_xstring

And here is a sample using cl_ixml .

TYPES: BEGIN OF tp_alv_data_1 .
TYPES: date        TYPE char32 ,
        name        TYPE char32 ,
        currency    TYPE char32 ,
        country     TYPE char32 ,
        rate        TYPE char32 ,
        ukurs       TYPE tcurr-ukurs ,
        change      TYPE char32 .
TYPES: END OF tp_alv_data_1 .
*
TYPES: tp_alv_data_1_tab TYPE STANDARD TABLE OF tp_alv_data_1  .

FORM do_xml_parse_1

  USING

    xml_string TYPE xstring

  CHANGING

    it_alv_data_1 TYPE tp_alv_data_1_tab .

  IF xml_string IS INITIAL .

    RETURN .

  ENDIF .

  DATA: st_alv_data_1 LIKE LINE OF it_alv_data_1 .

  g_ixml = cl_ixml=>create( ).

  DATA: streamfactory TYPE REF TO if_ixml_stream_factory.

  streamfactory = g_ixml->create_stream_factory( ).

  DATA: istream TYPE REF TO if_ixml_istream.

  istream  = streamfactory->create_istream_xstring( string = xml_string ).

  DATA: document TYPE REF TO if_ixml_document.

  document = g_ixml->create_document( ) .

  DATA: parser TYPE REF TO if_ixml_parser.

  parser = g_ixml->create_parser( stream_factory = streamfactory

                                  istream        = istream

                                  document       = document ).

  parser->parse( ).

*------------------------------

  DATA: date  TYPE string .

  DATA: name  TYPE string .

  DATA: value TYPE string .

*------------------------------

  DATA: nodes_x TYPE REF TO if_ixml_node_collection .

  DATA: node_x  TYPE REF TO if_ixml_node .

  nodes_x = document->get_elements_by_tag_name( name = 'LAST_UPDATE' ).

  node_x = nodes_x->get_item( 0 ) .

  name  = node_x->get_name( ) .

  date  = node_x->get_value( ) .

  st_alv_data_1-date = node_x->get_value( ) .

*------------------------------

  DATA: length_0 TYPE i .

  DATA: nodes_0 TYPE REF TO if_ixml_node_collection.

  DATA: node_0  TYPE REF TO if_ixml_node .

  DATA: length_1 TYPE i .

  DATA: nodes_1 TYPE REF TO if_ixml_node_list .

  DATA: node_1  TYPE REF TO if_ixml_node .

  nodes_0 = document->get_elements_by_tag_name( name = 'CURRENCY' ).

  length_0 = nodes_0->get_length( ) .

  DATA: index TYPE i .

  DO length_0 TIMES .

    index = sy-index - 1 .

    node_0 = nodes_0->get_item( index ) .

    name  = node_0->get_name( ) .

    value = space .

    nodes_1 = node_0->get_children( ) .

    length_1 = nodes_1->get_length( ).

    DO length_1 TIMES .

      index = sy-index - 1 .

      node_1 = nodes_1->get_item( index ).

      name  = node_1->get_name( ) .

      value = node_1->get_value( ) .

      CASE name .

        WHEN 'NAME' .

          st_alv_data_1-name = value .

        WHEN 'CURRENCYCODE' .

          st_alv_data_1-currency = value .

        WHEN 'COUNTRY' .

          st_alv_data_1-country = value .

        WHEN 'RATE' .

          st_alv_data_1-rate  = value .

          st_alv_data_1-ukurs = value .

        WHEN 'CHANGE' .

          st_alv_data_1-change = value .

      ENDCASE .

    ENDDO .

    APPEND st_alv_data_1 TO it_alv_data_1 .

  ENDDO .

ENDFORM .                    "do_xml_parse_1

Regards.

0 Kudos
246

Thanks Eitan for taking the time. I could not get this to work at all. However it did give me a better understanding.

I have since been able to parse the XML using call transformation after coming across the XLST tool wizard which proved most helpful.

Thanks again for your time.