18 Replies Latest reply: Mar 27, 2012 11:20 AM by Aastha Mehrotra RSS

Upload XML to internal table and vice versa in SAP 4.6C

Rosemarie del Rosario
Currently Being Moderated

Hi,

   Happy New Year to you all!

   We are using 46C and I am beginning to learn about XML. We have a requirement to (1) upload an XML file into an internal table as well as (2) create an XML file from an internal table.

   I read some of the posted messages about this but they didn't seem to be applicable in 46C (I could be wrong).

   Could someone please help me using the sample file below?

************

  <?xml version="1.0" ?>

- <AUCTIONBLOCK>

- <ITEM>

  <TITLE>Still Life / Onions</TITLE>

  <ARTIST>Linda Mann</ARTIST>

  <DIMENSIONS>20x30 inches</DIMENSIONS>

  <MATERIALS>Oil</MATERIALS>

  <YEAR>1997</YEAR>

  <DESCRIPTION>Still Life</DESCRIPTION>

  <TIMESTAMP>1974</TIMESTAMP>

  </ITEM>

  </AUCTIONBLOCK>

**********

Many thanks,

Rosemarie

  • Re: Upload XML to internal table and vice versa in SAP 4.6C
    Rich Heilman
    Currently Being Moderated

    Please have a look at Thomas's blog.

     

    /people/thomas.jung3/blog/2005/05/15/abap-46c-to-640-delta-training

     

    CHeck out Unit 10.

     

     

    Regards,

    Rich Heilman

  • Re: Upload XML to internal table and vice versa in SAP 4.6C
    Maria João Paulo Rocha
    Currently Being Moderated

    Hi,

     

    Please see <a href="http://www.sdn.sap.com/irj/sdn/weblogs? blog=/pub/wlg/2702">XML DOM Processing in ABAP part II - Convert an XML file into an ABAP table using SAP DOM Approach</a>

     

    I've used it and worked fine.

     

    Regards,

    Maria João Rocha

     

  • Re: Upload XML to internal table and vice versa in SAP 4.6C
    Maria João Paulo Rocha
    Currently Being Moderated

    Hi,

     

    Ye,s I've to comment the l_parser->set_validating( mode = if_ixml_parser=>co_validate ) and the  c_conv     TYPE REF TO cl_abap_conv_in_ce, but i'm using this code at produtive system, and it wotks fine.

    Can you detail your error?

     

    Regards,

    Maria João Rocha

     

    • Re: Upload XML to internal table and vice versa in SAP 4.6C
      Rosemarie del Rosario
      Currently Being Moderated

      Hi Maria,

         The error message i'm getting is 'The type "CL_ABAP_CONV_IN_CE" is unknown'. Are you using 46C?

      If I comment the line

      " c_conv     TYPE REF TO cl_abap_conv_in_ce", and check the syntax again, I will then get the error 'Field (or function) "CL_ABAP_CONV_IN_CE=>CREATE(" unknown'. I will have to use another repository object that may contain the methods that  are being called in CL_ABAP_CONV_IN_CE such as below:

            c_conv = cl_abap_conv_in_ce=>create( input = l_xml_line-data replacement = space  ).

       

      Regards,

      Rosemarie

  • Re: Upload XML to internal table and vice versa in SAP 4.6C
    Vijayasarathy Raghunathan
    Currently Being Moderated

    Hi try this one

    *----


    *

    • Report ZPRUEBA_MML_13 *

    • Export an internal table to XML document *

    • NO BORRAR ESTE CODIGO *

    *----


    *

    REPORT ZPRUEBA_MML_13.

    *----


    *

    • PANTALLA SELECCION *

        PARAMETERS: GK_RUTA TYPE RLGRAP-FILENAME.

    • PANTALLA SELECCION *

    *----


    *

     

    *----


    *

    • TYPE TURNOS *

    TYPES: BEGIN OF TURNOS,

        LU LIKE T552A-TPR01,

        MA LIKE T552A-TPR01,

        MI LIKE T552A-TPR01,

        JU LIKE T552A-TPR01,

        VI LIKE T552A-TPR01,

        SA LIKE T552A-TPR01,

        DO LIKE T552A-TPR01,

    END OF TURNOS.

    • TYPE TURNOS *

    *----


    *

     

    *----


    *

    • TYPE SOCIO *

    TYPES: BEGIN OF SOCIO,

        NUMERO LIKE PERNR-PERNR,

        REPOSICION LIKE PA0050-ZAUVE,

        NOMBRE LIKE PA0002-VORNA,

        TURNOS TYPE TURNOS,

    END OF SOCIO.

    • TYPE SOCIO *

    *----


    *

     

    *----


    *

    • ESTRUCTURA ACCESOS *

    DATA: BEGIN OF ACCESOS OCCURS 0,

        SOCIO TYPE SOCIO,

    END OF ACCESOS.

    • ESTRUCTURA ACCESOS *

    *----


    *

     

    *----


    *

    • START OF SELECTION *

    START-OF-SELECTION.

        PERFORM LLENA_ACCESOS.

        PERFORM DESCARGA_XML.

    END-OF-SELECTION.

    • END OF SELECTION *

    *----


    *

     

    *----


    *

    • FORM LLENA_ACCESOS *

    FORM LLENA_ACCESOS.

    REFRESH ACCESOS.

    CLEAR ACCESOS.

    MOVE: '45050' TO ACCESOS-SOCIO-NUMERO,

                  'MOISES MORENO' TO ACCESOS-SOCIO-NOMBRE,

                  '0' TO ACCESOS-SOCIO-REPOSICION,

                  'T1' TO ACCESOS-SOCIO-TURNOS-LU,

                  'T2' TO ACCESOS-SOCIO-TURNOS-MA,

                  'T3' TO ACCESOS-SOCIO-TURNOS-MI,

                  'T4' TO ACCESOS-SOCIO-TURNOS-JU,

                  'T5' TO ACCESOS-SOCIO-TURNOS-VI,

                  'T6' TO ACCESOS-SOCIO-TURNOS-SA,

                  'T7' TO ACCESOS-SOCIO-TURNOS-DO.

    APPEND ACCESOS.

    CLEAR ACCESOS.

    MOVE: '45051' TO ACCESOS-SOCIO-NUMERO,

                  'RUTH PEÑA' TO ACCESOS-SOCIO-NOMBRE,

                  '0' TO ACCESOS-SOCIO-REPOSICION,

                  'T1' TO ACCESOS-SOCIO-TURNOS-LU,

                  'T2' TO ACCESOS-SOCIO-TURNOS-MA,

                  'T3' TO ACCESOS-SOCIO-TURNOS-MI,

                  'T4' TO ACCESOS-SOCIO-TURNOS-JU,

                  'T5' TO ACCESOS-SOCIO-TURNOS-VI,

                  'T6' TO ACCESOS-SOCIO-TURNOS-SA,

                  'T7' TO ACCESOS-SOCIO-TURNOS-DO.

    APPEND ACCESOS.

    ENDFORM.

    • FORM LLENA_ACCESOS *

    *----


    *

     

    *----


    *

    • FORM DESCARGA_XML *

    FORM DESCARGA_XML.

    DATA: L_DOM TYPE REF TO IF_IXML_ELEMENT,

                  M_DOCUMENT TYPE REF TO IF_IXML_DOCUMENT,

                  G_IXML TYPE REF TO IF_IXML,

                  W_STRING TYPE XSTRING,

                  W_SIZE TYPE I,

                  W_RESULT TYPE I,

                  W_LINE TYPE STRING,

                  IT_XML TYPE DCXMLLINES,

                  S_XML LIKE LINE OF IT_XML,

                  W_RC LIKE SY-SUBRC.

     

    DATA: XML TYPE DCXMLLINES.

    DATA: RC TYPE SY-SUBRC,

    BEGIN OF XML_TAB OCCURS 0,

                  D LIKE LINE OF XML,

    END OF XML_TAB.

     

    CLASS CL_IXML DEFINITION LOAD.

    G_IXML = CL_IXML=>CREATE( ).

    CHECK NOT G_IXML IS INITIAL.

    M_DOCUMENT = G_IXML->CREATE_DOCUMENT( ).

    CHECK NOT M_DOCUMENT IS INITIAL.

    WRITE: / 'Converting DATA TO DOM 1:'.

    CALL FUNCTION 'SDIXML_DATA_TO_DOM'

    EXPORTING

                  NAME = 'ACCESOS'

                  DATAOBJECT = ACCESOS[]

    IMPORTING

                  DATA_AS_DOM = L_DOM

    CHANGING

                  DOCUMENT = M_DOCUMENT

    EXCEPTIONS

                  ILLEGAL_NAME = 1

                  OTHERS = 2.

    IF SY-SUBRC = 0.

                  WRITE 'Ok'.

    ELSE.

                  WRITE: 'Err =',

                  SY-SUBRC.

    ENDIF.

    CHECK NOT L_DOM IS INITIAL.

    W_RC = M_DOCUMENT->APPEND_CHILD( NEW_CHILD = L_DOM ).

    IF W_RC IS INITIAL.

                  WRITE 'Ok'.

    ELSE.

                  WRITE: 'Err =',

                  W_RC.

    ENDIF.

    CALL FUNCTION 'SDIXML_DOM_TO_XML'

    EXPORTING

                  DOCUMENT = M_DOCUMENT

    IMPORTING

                  XML_AS_STRING = W_STRING

                  SIZE = W_SIZE

    TABLES

                  XML_AS_TABLE = IT_XML

    EXCEPTIONS

                  NO_DOCUMENT = 1

                  OTHERS = 2.

    IF SY-SUBRC = 0.

                  WRITE 'Ok'.

    ELSE.

                  WRITE: 'Err =',

                  SY-SUBRC.

    ENDIF.

    LOOP AT IT_XML INTO XML_TAB-D.

                  APPEND XML_TAB.

    ENDLOOP.

    CALL FUNCTION 'WS_DOWNLOAD'

    EXPORTING

                  BIN_FILESIZE = W_SIZE

                  FILENAME = GK_RUTA

                  FILETYPE = 'BIN'

    TABLES

                  DATA_TAB = XML_TAB

    EXCEPTIONS

                  OTHERS = 10.

    IF SY-SUBRC <> 0.

                  MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

                  WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

    ENDIF.

     

    ENDFORM.

    • FORM DESCARGA_XML *

    *----


    *

     

  • Re: Upload XML to internal table and vice versa in SAP 4.6C
    Maria João Paulo Rocha
    Currently Being Moderated

    Hi,

     

    Yes I'm on 4.6c. I've to comment several lines. Here is an example:

     

    *&----


    *

    *& Report  z_xit_xml_check

    *&----


    *

      report  z_xit_xml_check.

     

     

      class cl_ixml definition load.

     

      type-pools: ixml.

     

      types: begin of t_xml_line,

              data(256) type x,

            end of t_xml_line,

     

            begin of tsfixml,

              data(1024) type c,

            end of tsfixml.

     

     

      data: l_ixml            type ref to if_ixml,

            l_streamfactory   type ref to if_ixml_stream_factory,

            l_parser          type ref to if_ixml_parser,

            l_istream         type ref to if_ixml_istream,

            l_document        type ref to if_ixml_document,

            l_node            type ref to if_ixml_node,

            l_xmldata         type string.

     

      data: l_elem            type ref to if_ixml_element,

            l_root_node       type ref to if_ixml_node,

            l_next_node       type ref to if_ixml_node,

            l_name            type string,

            l_iterator        type ref to if_ixml_node_iterator.

     

      data: l_xml_table       type table of t_xml_line,

            l_xml_line        type t_xml_line,

            l_xml_table_size  type i.

      data: l_filename        type string.

     

     

      parameters: pa_file type char1024 default

      'd:joaodesenvolvimentos i act     este.xml'.

    • Validation of XML file: Only DTD included in xml document is supported

      parameters: pa_val  type char1 as checkbox.

     

      start-of-selection.

     

    •   Creating the main iXML factory

        l_ixml = cl_ixml=>create( ).

     

    •   Creating a stream factory

        l_streamfactory = l_ixml->create_stream_factory( ).

     

    Regards,

    Maria João Rocha

        perform get_xml_table changing l_xml_table_size l_xml_table.

     

     

    •   wrap the table containing the file into a stream

        l_istream = l_streamfactory->create_istream_itable( table =

    l_xml_table

                                                        size  =

    l_xml_table_size ).

     

    •   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 ).

     

    •   Validate a document

        if pa_val eq 'X'.

    •    l_parser->set_validating( mode = if_ixml_parser=>co_validate ).

        endif.

     

    •   Parse the stream

        if l_parser->parse( ) ne 0.

          if l_parser->num_errors( ) ne 0.

            data: parseerror type ref to if_ixml_parse_error,

                  str        type string,

                  i          type i,

                  count      type i,

                  index      type i.

     

            count = l_parser->num_errors( ).

            write: count, ' parse errors have occured:'.

            index = 0.

            while index < count.

              parseerror = l_parser->get_error( index = index ).

              i = parseerror->get_line( ).

              write: 'line: ', i.

              i = parseerror->get_column( ).

              write: 'column: ', i.

              str = parseerror->get_reason( ).

              write: str.

              index = index + 1.

            endwhile.

          endif.

        endif.

     

    •   Process the document

        if l_parser->is_dom_generating( ) eq 'X'.

          perform process_dom using l_document.

        endif.

     

     

    *&----


    *

    *&      Form  get_xml_table

    *&----


    *

      form get_xml_table changing l_xml_table_size type i

                                  l_xml_table      type standard table.

     

    •   Local variable declaration

        data: l_len      type i,

              l_len2     type i,

              l_tab      type tsfixml,

              l_content  type string,

              l_str1     type string,

    •         c_conv     TYPE REF TO cl_abap_conv_in_ce,

              l_itab     type table of string.

     

     

        l_filename = pa_file.

    •   upload a file from the client's workstation

        call method cl_gui_frontend_services=>gui_upload

          exporting

            filename   = l_filename

            filetype   = 'BIN'

          importing

            filelength = l_xml_table_size

          changing

            data_tab   = l_xml_table

          exceptions

            others     = 19.

        if sy-subrc <> 0.

          message id sy-msgid type sy-msgty number sy-msgno

                     with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

        endif.

     

    •   Writing the XML document to the screen

    •    CLEAR l_str1.

    •    LOOP AT l_xml_table INTO l_xml_line.

    •      c_conv = cl_abap_conv_in_ce=>create( input = l_xml_line-data

    *replacement = space  ).

    •      c_conv->read( IMPORTING data = l_content len = l_len ).

    •      CONCATENATE l_str1 l_content INTO l_str1.

    •    ENDLOOP.

    •    l_str1 = l_str1+0(l_xml_table_size).

    •    SPLIT l_str1 AT cl_abap_char_utilities=>cr_lf INTO TABLE l_itab.

    •    WRITE: /.

    •    WRITE: /' XML File'.

    •    WRITE: /.

    •    LOOP AT l_itab INTO l_str1.

    •      REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>horizontal_tab

    *IN

    •        l_str1 WITH space.

    •      WRITE: / l_str1.

    •    ENDLOOP.

    •    WRITE: /.

      endform.                    "get_xml_table

     

    *&----


    *

    *&      Form  process_dom

    *&----


    *

      form process_dom using document type ref to if_ixml_document.

     

        data: node      type ref to if_ixml_node,

              iterator  type ref to if_ixml_node_iterator,

              nodemap   type ref to if_ixml_named_node_map,

              attr      type ref to if_ixml_node,

              name      type string,

              prefix    type string,

              value     type string,

              indent    type i,

              count     type i,

              index     type i.

     

     

    data: name2 type string,

          name_root type string,

          node_parent      type ref to if_ixml_node,

          node_root        type ref to if_ixml_node,

          num_children     type i.

     

     

        node ?= document.

     

        check not node is initial.

     

        uline.

        write: /.

        write: /' DOM-TREE'.

        write: /.

        if node is initial. exit. endif.

    •   create a node iterator

        iterator  = node->create_iterator( ).

    •   get current node

        node = iterator->get_next( ).

     

    •   loop over all nodes

        while not node is initial.

          indent = node->get_height( ) * 2.

          indent = indent + 20.

     

    num_children = node->num_children( ).

          case node->get_type( ).

            when if_ixml_node=>co_node_element.

    •         element node

              name    = node->get_name( ).

              nodemap = node->get_attributes( ).

              node_root = node->get_root( ).

              name_root = node_root->get_name( ).

                        write: / 'ELEMENT  :'.

              write: at indent name color col_positive inverse.

              write: 'NUM_CHILDREN:', num_children.

              write: 'ROOT:', name_root.

              node_parent = node->get_parent( ).

              name2    = node_parent->get_name( ).

              write: 'NAME2: ' , name2.

     

              if not nodemap is initial.

    •           attributes

                count = nodemap->get_length( ).

                do count times.

                  index  = sy-index - 1.

                  attr   = nodemap->get_item( index ).

                  name   = attr->get_name( ).

    •             prefix = attr->get_namespace_prefix( ).

                  value  = attr->get_value( ).

                  write: / 'ATTRIBUTE:'.

                  write: at indent name  color col_heading inverse, '=',

                                   value color col_total   inverse.

                enddo.

              endif.

            when if_ixml_node=>co_node_text or

                 if_ixml_node=>co_node_cdata_section.

    •         text node

              value  = node->get_value( ).

              write: / 'VALUE     :'.

     

     

    • mjprocha

              node_parent = node->get_parent( ).

              write: at indent value color col_group inverse.

              name2    = node_parent->get_name( ).

              write: 'NAME2: ' , name2.

          endcase.

    •     advance to next node

          node = iterator->get_next( ).

        endwhile.

      endform.                    "process_dom

     

  • Re: Upload XML to internal table and vice versa in SAP 4.6C
    magnolia seville
    Currently Being Moderated

    Hi - May I know how you have uploaded the xml file from the application server successfully using the read dataset? Help is greatly appreciated.

     

    Thanks!

  • Re: Upload XML to internal table and vice versa in SAP 4.6C
    ANIL KUMAR DACHEPALLI
    Currently Being Moderated

    Hello Rosemarie del Rosario,

     

    iam also having the same requirement like 1)uploading data from XML file into internal table 2) downloading data from internal table into a XML file. do u have any coding for the above scenarios, if u have plz forward that to my mail id please.my mail id is loginto_anil@yahoo.co.in.

     

    thanks in advance.

     

    anil.

    • Re: Upload XML to internal table and vice versa in SAP 4.6C
      jessica sam
      Currently Being Moderated

      Hey Anil did u find a solution?

       

      I need to convert XML data to intenal table data. if u could solve please let me know how you did that?

      • Re: Upload XML to internal table and vice versa in SAP 4.6C
        SEBASTIAN DUQUE RODRIGUEZ
        Currently Being Moderated

        Hi everyone,

        I've found this code to import a xml file into an internal table and that It has worked for me! I only did a few modifications to display the information.

         

        
        REPORT z_read_xml_file.
        PARAMETERS: p_filnam TYPE localfile OBLIGATORY DEFAULT 'C:\Documents and Settings\ssaha\Desktop\test.xml'.
        
        AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_filnam.
          DATA: l_v_fieldname TYPE dynfnam.
          l_v_fieldname = p_filnam.
          CALL FUNCTION 'F4_FILENAME'
            EXPORTING
              program_name  = syst-cprog
              dynpro_number = syst-dynnr
              field_name    = l_v_fieldname
            IMPORTING
              file_name     = p_filnam.
        
        START-OF-SELECTION.
          TYPES: BEGIN OF ty_tab,
          name TYPE string,
          value TYPE string,
          END OF ty_tab.
          DATA: lcl_xml_doc TYPE REF TO cl_xml_document,
          v_subrc TYPE sysubrc,
          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.
          DATA: itab TYPE STANDARD TABLE OF ty_tab,
          wa TYPE ty_tab.
          CREATE OBJECT lcl_xml_doc.
          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.
          LOOP AT itab INTO wa.
            WRITE: / 'Nombre/TipoCampo: ', wa-name,
                   / 'value: ', wa-value.
        
          ENDLOOP.
          .

         

        When you have the data into the internal tab,  you can use a SELECT statement to get what you want.

         

        This is a test xml file:

         

        <?xml version="1.0" encoding="utf-8"?>
        <Version xmlns="">Version 1.2</Version>
        <<ObjectTypeName>Talon_Confirmacion</ObjectTypeName>
        <RootFolder xmlns="">Aseguradoras\Talon_Confirmacion</RootFolder>
        <AddFolders xmlns="">0</AddFolders><IndexFields xmlns="">
        <Field>
        <FieldName>Fecha</FieldName>
        <FieldValues>
        <FieldValue>12/08/09</FieldValue>
        </FieldValues>
        </Field>
        <Field>
        <FieldName>Dependencia</FieldName>
        <FieldValues>
        <FieldValue>090</FieldValue>
        </FieldValues></Field><Field>
        <FieldName>Op</FieldName>
        <FieldValues>
        <FieldValue>F09001</FieldValue>
        </FieldValues></Field>
        <Field>
        <FieldName>Sec</FieldName>
        <FieldValues>
        <FieldValue>0000000107</FieldValue>
        </FieldValues>
        </Field>
        </IndexFields>

         

        Hope this helps.

         

        Bye!

      • Re: Upload XML to internal table and vice versa in SAP 4.6C
        Aastha Mehrotra
        Currently Being Moderated

        Hi,

        Please check out my article about this conversion.

        It is a very simple and step by step document along with the code. the code snippets there can be combined to form the entire code for conversion.

        Kindly follow the link:

        http://scn.sap.com/docs/DOC-24791

        In case you come across any doubts please feel free to contact me.

        Thanks and regards,

        Aastha

Actions